<?php
 /**
 * Fonctions du noyau
 * @package Garennes
 * @author Jean-Francois Campan <jean-francois.campan@ac-poitiers.fr>
 * @author Jean-Denis Chadozeau <jeandenis.chadozeau@gmail.com>
 * @version 0.6.13
 */
 /**
 * Version du logiciel
 * @global string $version_garennes
 */
 $version_garennes = "0.6.13-6" ;
 
 /**
 * Constantes pour debuggage
 */
 $debug_SQL = 0 ; // Si 0, pas de debuggage, si 1 alors debuggage sur le navigateur
 $debug_fonction = 0 ; // Si 0, pas de debuggage, si 1 alors debuggage sur le navigateur
 $debug_php = 0 ; // Si 0, pas de debuggage, si 1 alors debuggage sur le navigateur
 $debug_journal = 0 ; // Si 0, pas de debuggage, si 1 alors debuggage dans la bdd table journal
 $debug_simulation = 0 ; // Si 0, pas de simulation des requetes SQL, si 1 alors simualtion des requetes SQL avec affichage
 
 /**
 * Definition des pages generees sur le navigateur
 * @global string $navigateur_type_doc (HTML [1,2,3] ou XHTML [4,5,6]
 * @global string $navigateur_type_codage Table de codage : UTF-8, ISO-8859-1 ou ISO-8859-15
 * @global string $caracteres_client_SQL Codage des caracteres lors des requetes SQL (client)
 * @global string $caracteres_serveur_SQL Codage des caracteres sur le serveur SQL
 * @global string $caracteres_document_PDF Codage des caracteres pour les PDF a utiliser pour les reponses SQL
 * @global string $caracteres_serveur_SQL Codage des caracteres lors des reponses SQL
 * @global string $caracteres_fichiers Codage des fichiers sur le systeme
 */
 $navigateur_type_doc = 2 ;
 $navigateur_type_codage = "utf-8" ; // ISO-8859-1 ou ISO-8859-15 ou UTF-8
 $caracteres_client_SQL = "utf8" ; // utf8/latin1
 $caracteres_tables_SQL = "utf8" ; // utf8/latin1
 //$caracteres_client_nav = "utf8" ; // ISO-8859-1 ou ISO-8859-15 ou UTF-8
 $caracteres_document_PDF = "latin1" ; // utf8/latin1
 $caracteres_serveur_SQL = "latin1" ; // utf8/latin1
 $caracteres_fichiers = "utf8" ; // utf8/latin1
 
 /**
 * Nom generique des tables pour importation GEP
 * @global string $sql_imp
 */
 $sql_imp = "gep" ; // Nom generique des tables pour importation GEP
 $sql_sconet = "sconet" ; // Nom generique des tables pour importation SCONET
 $sauvegarde_fichier_actif = 0 ; // 0=Pas de sauvegarde des fichiers dans la bdd, 1=Sauvegarde des fichiers dans la bdd
 
 // Creation du separateur en fonction des OS
 If (StrToUpper (SubStr (PHP_OS, 0, 3)) == "WIN") { $separateur_repertoire = "\\" ; } Else { $separateur_repertoire = "/" ; }

 /**
 * Chemin d'acces aux pages de gestion
 * En absolu
 * @global string $repertoire_eleve
 * @global string $repertoire_trombinoscope
 * @global string $repertoire_cpe
 * @global string $repertoire_surveillant
 * @global string $repertoire_profs
 * @global string $repertoire_secre
 * @global string $repertoire_direc
 * @global string $repertoire_admin
 * @global string $repertoire_config
 * @global string $repertoire_sauvegarde
 * @global string $repertoire_restauration
 */
 If (IsSet ($repertoire_racine))
  {
   $repertoire_eleve = $repertoire_racine."public" ;
   $repertoire_trombinoscope = $repertoire_racine."trombinoscope" ;
   $repertoire_cpe = $repertoire_racine."cpe" ;
   $repertoire_surveillant = $repertoire_racine."surveillant" ;
   $repertoire_profs = $repertoire_racine."professeurs" ;
   $repertoire_secre = $repertoire_racine."secretariat" ;
   $repertoire_direc = $repertoire_racine."direction" ;
   $repertoire_admin = $repertoire_racine."administration" ;
   $repertoire_superviseur = $repertoire_racine."supervision" ;
   $repertoire_config = $repertoire_racine."include" ;
   $repertoire_sauvegarde = $repertoire_admin.$separateur_repertoire."sauvegarde" ;
   $repertoire_restauration = $repertoire_admin.$separateur_repertoire."restauration" ;
   $repertoire_temporaire = $repertoire_racine."tmp" ;
   $repertoire_logos_bulletins = "images".$separateur_repertoire."logos" ;
   $repertoire_logos_releves = "images".$separateur_repertoire."logos" ;
   $repertoire_logos_bulletins_racine = $repertoire_racine."images".$separateur_repertoire."logos" ;
   $repertoire_logos_releves_racine = $repertoire_racine."images".$separateur_repertoire."logos" ;
   $http_logos_bulletins = $http_garennes."images/logos" ;
   $http_logos_releves = $http_garennes."images/logos" ;
  }
 Else
  {
   $repertoire_logos_bulletins = "images".$separateur_repertoire."logos" ;
   $repertoire_logos_releves = "images".$separateur_repertoire."logos" ;
   $repertoire_logos_bulletins_racine = "./images/logos" ;
   $repertoire_logos_releves_racine = "./images/logos" ;
  }

 /**
 * Parametres de connexions via le HTTP ou le HTTPs
 * @global string $http_eleve
 * @global string $http_trombinoscope
 * @global string $http_cpe
 * @global string $http_surveillant
 * @global string $http_profs
 * @global string $http_secre
 * @global string $http_direc
 * @global string $http_admin
 */
 If (!IsSet ($http_garennes))
  {
   $n = Explode ("/", $_SERVER ["PHP_SELF"]) ;
   $http_garennes = "http://".GetEnv ("HTTP_HOST")."/".$n [1]."/" ;
  }
 /*
 Else
  {
   $http_eleve = $http_garennes."public/" ;
   $http_trombinoscope = $http_garennes."trombinoscope/" ;
   $http_cpe = $http_garennes."cpe/" ;
   $http_surveillant = $http_garennes."surveillant/" ;
   $http_profs = $http_garennes."professeurs/" ;
   $http_secre = $http_garennes."secretariat/" ;
   $http_direc = $http_garennes."direction/" ;
   $http_admin = $http_garennes."administration/" ;
   $http_supervision = $http_garennes."supervision/" ;
  }
 */
 $http_eleve = $http_garennes."public/" ;
 $http_trombinoscope = $http_garennes."trombinoscope/" ;
 $http_cahier_textes = $http_garennes."cahier_textes/" ;
 $http_cpe = $http_garennes."cpe/" ;
 $http_surveillant = $http_garennes."surveillant/" ;
 $http_profs = $http_garennes."professeurs/" ;
 $http_secre = $http_garennes."secretariat/" ;
 $http_direc = $http_garennes."direction/" ;
 $http_admin = $http_garennes."administration/" ;
 $http_supervision = $http_garennes."supervision/" ;
 
 /**
 * Les differentes pages
 * @global string $page_sortie
 * @global string $page_premiere
 * @global string $page_rien
 */
 If (IsSet ($http_garennes))
  {
   $page_sortie = $http_garennes."sortie.php" ;
   $page_premiere = $http_garennes."index.php" ;
   $page_rien = $http_garennes."" ;
  }
 
 /**
 * Definition des droits d'acces
 * @global int $aucun_droit
 * @global int $droit_eleve
 * @global int $droit_trombinoscope
 * @global int $droit_prof
 * @global int $droit_surveillant
 * @global int $droit_cpe
 * @global int $droit_secretariat
 * @global int $droit_direction
 * @global int $droit_admin
 */
 $aucun_droit = 0 ;
 $droit_eleve = 10 ;
 $droit_cahier_textes = 11 ;
 $droit_trombinoscope = 15 ;
 $droit_prof = 20 ;
 $droit_surveillant = 25 ;
 $droit_cpe = 30 ;
 $droit_secretariat = 40 ;
 $droit_direction = 50 ;
 $droit_admin = 60 ;
 $droit_supervision = 70 ;
 
 /**
 * Constantes pour les types de caracteres
 */
 Define ("SQL_AFFICHAGE_HTML","1") ; // Defaut
 Define ("SQL_EDITION_HTML","2") ;
 Define ("SQL_AFFICHAGE_PDF","3") ;
 Define ("FIC_AFFICHAGE_HTML","10") ; // Defaut
 Define ("FIC_EDITION_HTML","11") ;
 Define ("FIC_AFFICHAGE_PDF","12") ;
 
 /**
 * Constantes pour les types d'etablisement
 */
 $types_etablissement [0] = 4 ;
 $types_etablissement [1] = "Coll&egrave;ge" ;
 $types_etablissement [2] = "Lyc&eacute;e" ;
 $types_etablissement [3] = "Universit&eacute;" ;
 $types_etablissement [4] = "&Eacute;cole" ;
 
 /**
 * Definition des constantes de gestion des type de moyennes pour la table moyennes
 * @global int $note_normale
 * @global int $note_exam
 * @global int $moy_normale
 * @global int $min_normal
 * @global int $max_normal
 * @global int $moy_classe_normale
 * @global int $min_classe_normal
 * @global int $max_classe_normal
 * @global int $moy_classe_exam
 * @global int $min_classe_exam
 * @global int $max_classe_exam
 */
 Define ("NOTE_MOY_ELEVE_DISC", 10) ; // Moyenne partielle d'un eleve pour la discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MOY_ELEVE_EXAM", 11) ; // Moyenne partielle d'un eleve pour la discipline dans un examen blanc (id_service_prof,id_service_classe)
 Define ("NOTE_MOY_ELEVE_SMAT", 12) ; // Moyenne partielle d'un eleve pour une sous-matiere d'une discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MOY_ELEVE_SMAT_EXAM", 13) ; // Moyenne partielle d'un eleve pour une sous-matiere d'une discipline sur les examens blancs (id_service_prof,id_service_classe)
 Define ("NOTE_MOY_CLASSE_CONTROLE", 14) ; // Moyenne classe pour chaque controle
 Define ("NOTE_MOY_CLASSE_DISC", 15) ; // Moyenne classe d'une discipline tout eleve
 Define ("NOTE_MOY_CLASSE_DISC_EXAM", 16) ; // Moyenne classe d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MOY_CLASSE_SMAT", 17) ; // Moyenne classe sous-matiere d'une discipline tout eleve
 Define ("NOTE_MOY_CLASSE_SMAT_EXAM", 18) ; // Moyenne classe d'une sous-matiere d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MOY_CLASSE", 19) ; // Moyenne classe toutes disciplines
 Define ("NOTE_MOY_CLASSE_EXAM", 20) ; // Moyenne classe toutes disciplines sur les examens blancs
 Define ("NOTE_MOY_REGROUPEMENT", 21) ; // Moyenne partielle d'un regroupement de disciplines
 Define ("NOTE_MOY_REGROUPEMENT_EXAM", 22) ; // Moyenne partielle d'un regroupement de disciplines sur les examens blancs
 Define ("NOTE_MOY_ELEVE_PERIODE", 23) ; // Moyenne partielle d'un eleve pour une periode toute discipline
 
 Define ("NOTE_MIN_ELEVE_DISC", 30) ; // Minimum d'un eleve pour la discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MIN_ELEVE_EXAM", 31) ; // Minimum d'un eleve pour la discipline dans un examen blanc (id_service_prof,id_service_classe)
 Define ("NOTE_MIN_ELEVE_SMAT", 32) ; // Minimum d'un eleve pour une sous-matiere d'une discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MIN_ELEVE_SMAT_EXAM", 33) ; // Minimum d'un eleve pour une sous-matiere d'une discipline sur les examens blancs (id_service_prof,id_service_classe)
 Define ("NOTE_MIN_CLASSE_CONTROLE", 34) ; // Minimum classe pour chaque controle
 Define ("NOTE_MIN_CLASSE_DISC", 35) ; // Minimum classe d'une discipline tout eleve
 Define ("NOTE_MIN_CLASSE_DISC_EXAM", 36) ; // Minimum classe d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MIN_CLASSE_SMAT", 37) ; // Minimum classe sous-matiere d'une discipline tout eleve
 Define ("NOTE_MIN_CLASSE_SMAT_EXAM", 38) ; // Minimum classe d'une sous-matiere d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MIN_CLASSE", 39) ; // Minimum classe toutes disciplines
 Define ("NOTE_MIN_CLASSE_EXAM", 40) ; // Minimum classe toutes disciplines sur les examens blancs
 Define ("NOTE_MIN_REGROUPEMENT", 41) ; // Minimum d'un regroupement de discipline
 Define ("NOTE_MIN_REGROUPEMENT_EXAM", 42) ; // Minimum d'un regroupement de discipline sur les examens blanc
 Define ("NOTE_MIN_ELEVE_PERIODE", 43) ; // Minimum d'un eleve pour une periode toute discipline
 
 Define ("NOTE_MAX_ELEVE_DISC", 50) ; // Maximum d'un eleve pour la discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MAX_ELEVE_EXAM", 51) ; // Maximum d'un eleve pour la discipline dans un examen blanc (id_service_prof,id_service_classe)
 Define ("NOTE_MAX_ELEVE_SMAT", 52) ; // Maximum d'un eleve pour une sous-matiere d'une discipline (id_service_prof,id_service_classe)
 Define ("NOTE_MAX_ELEVE_SMAT_EXAM", 53) ; // Maximum d'un eleve pour une sous-matiere d'une discipline sur les examens blancs (id_service_prof,id_service_classe)
 Define ("NOTE_MAX_CLASSE_CONTROLE", 54) ; // Maximum classe pour chaque controle
 Define ("NOTE_MAX_CLASSE_DISC", 55) ; // Maximum classe d'une discipline tout eleve
 Define ("NOTE_MAX_CLASSE_DISC_EXAM", 56) ; // Maximum classe d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MAX_CLASSE_SMAT", 57) ; // Maximum classe sous-matiere d'une discipline tout eleve
 Define ("NOTE_MAX_CLASSE_SMAT_EXAM", 58) ; // Maximum classe d'une sous-matiere d'une discipline sur les examens blancs tout eleve
 Define ("NOTE_MAX_CLASSE", 59) ; // Maximum classe toutes disciplines
 Define ("NOTE_MAX_CLASSE_EXAM", 60) ; // Maximum classe toutes disciplines sur les examens blancs
 Define ("NOTE_MAX_REGROUPEMENT", 61) ; // Maximum d'un regroupement de discipline
 Define ("NOTE_MAX_REGROUPEMENT_EXAM", 62) ; // Maximum d'un regroupement de discipline sur les examens blanc
 Define ("NOTE_MAX_ELEVE_PERIODE", 63) ; // Maximum d'un eleve pour une periode toute discipline
 
 $note_normale = 0 ;
 $note_exam = 1 ;
 $moy_normale = 2 ;
 $min_normal = 3 ;
 $max_normal = 4 ;
 $moy_classe_normale = 5 ;
 $min_classe_normal = 6 ;
 $max_classe_normal = 7 ;
 $moy_classe_exam = 8 ;
 $min_classe_exam = 9 ;
 $max_classe_exam = 10 ;
 
 /**
 * Mini max et maxi min
 * @global int $mini_max
 * @global int $maxi_min
 */
 $mini_max = -1000000 ;
 $maxi_min = 1000000 ;
 If (IsSet ($code_absent)) { $note_initiale = $code_absent ; } Else { $note_initiale = "A" ; }
 
 /**
 * Constantes pour les types de disciplines
 */
 $types_disciplines [0][0] = 2 ; // Nombre
 $types_disciplines [1][0] = "Normal" ; // Nom : Discipline multi-notes avec moyenne possible
 $types_disciplines [1][1] = 0 ; // Constante pour definition (reperage)
 $types_disciplines [1][2] = 0 ; // Type de moyenne : 0=Normale
 $types_disciplines [2][0] = "Sp&eacute;cifique" ; // Nom : Discipline speciale sans moyenne possible
 $types_disciplines [2][1] = 3 ; // Constante pour definition (reperage)
 $types_disciplines [2][2] = 1 ; // Type de moyenne : 1=%
 
 /**
 * Constantes pour les types de moyennes
 */
 Define ("MOYENNE_NORMALE", 0) ;
 Define ("MOYENNE_POURCENT", 1) ;
 $types_moyennes [0][0] = 2 ; // Nombre
 $types_moyennes [1][0] = "Normale" ; // Nom : Moyenne classique calculee sur le max
 $types_moyennes [1][1] = MOYENNE_NORMALE ; // Constante pour definition (reperage)
 $types_moyennes [2][0] = "Pourcentage" ; // Nom : Moyenne exprimee en % par rapport au max
 $types_moyennes [2][1] = MOYENNE_POURCENT ; // Constante pour definition (reperage)
 
 /**
 * Constantes pour Notanet
 */
 $nom_notanet = "CCF pour le DNB" ;
 
 /**
 * Constantes de sessions
 */
 $desactivation_eleve = 100 ; // Constante de desactivation des eleves dans une classe (exterieur+-desactivation_eleve)
 $duree_session_minimum = 180 ; // Duree minimum d'une session (pour sauvegarde)
 $timeout = 16 ; // Duree de vie d'un test de connexion a un serveur SQL
 $duree_exec_javascript = 300 ; // Duree entre deux execution des javascripts de verification en ms
 
 /**
 * Constantes pour Bulletin
 */
 $bulletin_nombre_cases_cocher_max = 8 ; // Nombre de cases a cocher en bas du bulletin maximal
 $bulletin_nombre_caracteres_max_par_case = 30 ; // Nombre de caracteres maximum pour une case
 $bulletin_nombre_cases_par_ligne = 4 ; // Nombre de cases a cocher par ligne sur le bulletin
 
 /**
 * Constantes pour les affichages
 */
 $affiche_numero = 0 ; // Affichage du numero de la discipline par rapport au bulletin (=1) ou le numero id_service_prof (=0)
 $aff_num_disc_prof = 0 ; // Affichage le numero de la discipline (=1) ou pas (=0) pour les enseignants
 $age_maximal = 100 ; // Age maximal lors de la saisie de la date de naissance
 $nbr_car_max_saisie_appreciations = 230 ; // Nombre de caracteres maximum pour la saisie des appreciations enseignantes
 $cahier_textes_id = 0 ; // 0=Aucun;-1=Etablissement particulier entier;>0=Classe particuliere seulement
 
 $vg = Explode (".", $version_garennes) ;
 $affichage_version_garennes = "<font color=\"#ff0000\">".$vg [0]."</font>.<font color=\"#00ff00\">".$vg [1]."</font>.<font color=\"#0000ff\">".$vg [2]."</font>" ;
 $nombre_generation_code_session = ($vg [0]+$vg [1]*10+$vg [2]*100)*753 ;
 
 // Extension des fichiers textes de sauvegarde/restauration
 $ext_texte = ".csv" ;
 $ext_sql = ".sql" ;

 // Taille photos
 $hauteur_photo = 180 ; // En pixels
 $largeur_photo = 130 ; // En pixels
 
 // Memo notes
 $hauteur_memo_popup = 280 ;
 $largeur_memo_popup = 550 ;
 $hauteur_memo_edition = 200 ;
 $largeur_memo_edition = 500 ;
 
 // Taille moitie photos
 $hauteur_petite_photo = $hauteur_photo/2 ;
 $largeur_petite_photo = $largeur_photo/2 ;
 $nbr_photo_largeur = 7 ;
 
 // Taille du graphique pour afficher le bilan eleve
 $largeur_graphe_defaut = 460 ; // Taille X totale
 $hauteur_graphe_defaut = 380 ; // Taille Y totale
 
 $largeur_graphe_mini_defaut = 320 ; // Taille X totale
 $hauteur_graphe_mini_defaut = 200 ; // Taille Y totale
 
 $largeur_graphe_maxi_defaut = 1600 ; // Taille X totale
 $hauteur_graphe_maxi_defaut = 1200 ; // Taille Y totale
 
 $graphe_pas_largeur_defaut = 1.1 ; // Pas pour augmentation ou reduction graphe en largeur
 $graphe_pas_hauteur_defaut = 1.1 ; // Pas pour augmentation ou reduction graphe en hauteur
 
 $couleur_fond_defaut = "#faff6a";//EFEFDC" ; // Couleur fond globale
 $couleur_fond_graphe_defaut = "#ffffff";//EFEFDC" ; // Couleur fond du graphe uniquement
 $couleur_fond_degrade_defaut = 1 ; // 0=Pas de degrade;1=Degrade
 $couleur_fond_degrade_finale_defaut = "#ffffff" ; // Couleur fond finale lors d'un degrade (couleur du haut)
 $couleur_comparaison_classe_fond_defaut = "#DDDDDD" ; // Couleur fond du graphe comparaison classe
 $couleur_comparaison_classe_contour_defaut = "#000000" ; // Couleur contour du graphe comparaison classe
 $couleur_comparaison_classe_moyenne_defaut = "#8FBCF7" ; // Couleur trace du graphe comparaison classe moyen
 $couleur_comparaison_classe_moyenne_contour_defaut = "#000F0F" ; // Couleur contour du graphe comparaison classe moyen
 
 // Type de graphique : cercle
 $taille_fonte_ordonnees_cercle_defaut = "2" ; // Taille fonte ordonnees
 $marge_matiere_graphique_cercle_defaut = 2 ; // Marge entre la matiere et la graphe
 $couleur_trait_repere_cercle_defaut = "#000000" ; // Couleur du reperage vertical
 $couleur_fond_vert_defaut = "#ADFF9F" ; // Couleur fond partie verte 60% a 100%
 $couleur_fond_orange_defaut = "#FFE2AF"; // Couleur fond partie verte 60% a 100%
 $couleur_fond_rouge_defaut = "#FFB5AF" ; // Couleur fond partie verte 60% a 100%
 $couleur_fond_rouge_final_defaut = "#FF4B0C" ; // Couleur fond partie verte 60% a 100%
 $taille_fonte_matiere_cercle_defaut = "5" ; // Taille fonte matieres
 
 
 $couleur_cercle_defaut [1] = "#0000FF" ; // Couleur cercle periode 1
 $couleur_cercle_defaut [2] = "#ED00FF" ; // Couleur cercle periode 2
 $couleur_cercle_defaut [3] = "#AB00FF" ; // Couleur cercle periode 3
 $couleur_cercle_defaut [4] = "#60BCB4" ; // Couleur cercle periode 4
 $couleur_cercle_defaut [5] = "#8C00FF" ; // Couleur cercle periode 5
 $couleur_cercle_defaut [6] = "#FFDD00" ; // Couleur cercle periode 6
 
 $couleur_cercle_compare_defaut [1] = "#0000FF" ; // Couleur cercle comparaison periode 1
 $couleur_cercle_compare_defaut [2] = "#ED00FF" ; // Couleur cercle comparaison periode 2
 $couleur_cercle_compare_defaut [3] = "#AB00FF" ; // Couleur cercle comparaison periode 3
 $couleur_cercle_compare_defaut [4] = "#60BCF4" ; // Couleur cercle comparaison periode 4
 $couleur_cercle_compare_defaut [5] = "#8C00FF" ; // Couleur cercle comparaison periode 5
 $couleur_cercle_compare_defaut [6] = "#FFDD00" ; // Couleur cercle comparaison periode 6
 
 $couleur_contour_point_cercle_defaut [1] = "#0000FF" ; // Couleur points periode 1
 $couleur_contour_point_cercle_defaut [2] = "#ED00FF" ; // Couleur points periode 2
 $couleur_contour_point_cercle_defaut [3] = "#AB00FF" ; // Couleur points periode 3
 $couleur_contour_point_cercle_defaut [4] = "#60BCF4" ; // Couleur points periode 4
 $couleur_contour_point_cercle_defaut [5] = "#8C00FF" ; // Couleur points periode 5
 $couleur_contour_point_cercle_defaut [6] = "#FFDD00" ; // Couleur points periode 6
 
 $taille_point_cercle_defaut [1] = 7 ; // Taille des points
 $taille_point_cercle_defaut [2] = 7 ; // Taille des points
 $taille_point_cercle_defaut [3] = 7 ; // Taille des points
 $taille_point_cercle_defaut [4] = 7 ; // Taille des points
 $taille_point_cercle_defaut [5] = 7 ; // Taille des points
 $taille_point_cercle_defaut [6] = 7 ; // Taille des points
 
 $forme_point_cercle_defaut [1] = 1 ; // Forme des points
 $forme_point_cercle_defaut [2] = 3 ; // Forme des points
 $forme_point_cercle_defaut [3] = 2 ; // Forme des points
 $forme_point_cercle_defaut [4] = 1 ; // Forme des points
 $forme_point_cercle_defaut [5] = 3 ; // Forme des points
 $forme_point_cercle_defaut [6] = 2 ; // Forme des points
 
 $couleur_point_compare_cercle_defaut [1] = "#E6E7E6" ; // Couleur point comparaison periode 1
 $couleur_point_compare_cercle_defaut [2] = "#E6E7E6" ; // Couleur point comparaison periode 2
 $couleur_point_compare_cercle_defaut [3] = "#E6E7E6" ; // Couleur point comparaison periode 3
 $couleur_point_compare_cercle_defaut [4] = "#E6E7E6" ; // Couleur point comparaison periode 4
 $couleur_point_compare_cercle_defaut [5] = "#E6E7E6" ; // Couleur point comparaison periode 5
 $couleur_point_compare_cercle_defaut [6] = "#E6E7E6" ; // Couleur point comparaison periode 6
 
 $couleur_contour_point_compare_cercle_defaut [1] = "#0000FF" ; // Couleur contour point comparaison periode 1
 $couleur_contour_point_compare_cercle_defaut [2] = "#ED00FF" ; // Couleur contour point comparaison periode 2
 $couleur_contour_point_compare_cercle_defaut [3] = "#AB00FF" ; // Couleur contour point comparaison periode 3
 $couleur_contour_point_compare_cercle_defaut [4] = "#60BCF4" ; // Couleur contour point comparaison periode 4
 $couleur_contour_point_compare_cercle_defaut [5] = "#8C00FF" ; // Couleur contour point comparaison periode 5
 $couleur_contour_point_compare_cercle_defaut [6] = "#FFDD00" ; // Couleur contour point comparaison periode 6
 
 $taille_point_compare_cercle_defaut [1] = 7 ; // Taille points comparaison periode 1
 $taille_point_compare_cercle_defaut [2] = 7 ; // Taille points comparaison periode 2
 $taille_point_compare_cercle_defaut [3] = 7 ; // Taille points comparaison periode 3
 $taille_point_compare_cercle_defaut [4] = 7 ; // Taille points comparaison periode 4
 $taille_point_compare_cercle_defaut [5] = 7 ; // Taille points comparaison periode 5
 $taille_point_compare_cercle_defaut [6] = 7 ; // Taille points comparaison periode 6
 
 $forme_point_compare_cercle_defaut [1] = 1 ; // Forme des points comparaison periode 1
 $forme_point_compare_cercle_defaut [2] = 3 ; // Forme des points comparaison periode 2
 $forme_point_compare_cercle_defaut [3] = 2 ; // Forme des points comparaison periode 3
 $forme_point_compare_cercle_defaut [4] = 1 ; // Forme des points comparaison periode 4
 $forme_point_compare_cercle_defaut [5] = 3 ; // Forme des points comparaison periode 5
 $forme_point_compare_cercle_defaut [6] = 2 ; // Forme des points comparaison periode 6
 
 // Legende
 $couleur_fond_legende_defaut = "#FFFFFF" ; // Couleur fond legende
 $couleur_contour_legende_defaut = "#000000" ; // Couleur fond legende
 $legende_3d = 1 ; // 1=3D, 0=2D
 $couleur_contour_3d_legende_defaut = "#888888" ; // Couleur fond legende
 $espace_entre_legende_h_defaut = 10 ; // Espace entre les legendes a l'horizontale
 $espace_entre_legende_v_defaut = 5 ; // Espace entre les legendes a la verticale
 $marge_legende_droite_defaut = 5 ; // Marge droite interieur legende
 $marge_legende_gauche_defaut = 5 ; // Marge gauche interieur legende
 $marge_legende_haut_defaut = 2 ; // Marge haut interieur legende
 $marge_legende_bas_defaut = 2 ; // Marge bas interieur legende
 $marge_legende_matiere_defaut = 5 ; // Marge entre la legende et les matieres
 $taille_fonte_legende_defaut = 2 ; // Taille fonte legende
 $taille_car_periode_legende_defaut = 5 ; // Nombre de caracteres du nom de periode (0=tout)
 
 $espace_entre_barre_defaut = 3 ; // Espace entre les barres
 $decalage_barre_compare_defaut = 3 ; // Espace entre les barres
 $taille_avant_grille_h_defaut = 2 ;
 $taille_arriere_grille_h_defaut = 1 ;
 $couleur_trait_grille_h_defaut = "#000000" ;
 $taille_avant_grille_v_defaut = 2 ;
 $taille_arriere_grille_v_defaut = 1 ;
 $couleur_trait_grille_v_defaut = "#000000" ;
 
 // Type de graphique : Barre
 $couleur_barre_defaut [1] = "#0000ff" ; // Couleur rectangle periode 1
 $couleur_barre_defaut [2] = "#FF7700" ; // Couleur rectangle periode 2
 $couleur_barre_defaut [3] = "#FF00B6" ; // Couleur rectangle periode 3
 $couleur_barre_defaut [4] = "#60BCF4" ; // Couleur rectangle periode 4
 $couleur_barre_defaut [5] = "#8C00FF" ; // Couleur rectangle periode 5
 $couleur_barre_defaut [6] = "#FFDD00" ; // Couleur rectangle periode 6
 
 $couleur_barre_degrade_defaut [1] = 0 ; // Activation du degrade pour le rectangle periode 1
 $couleur_barre_degrade_defaut [2] = 0 ; // Activation du degrade pour le rectangle periode 2
 $couleur_barre_degrade_defaut [3] = 0 ; // Activation du degrade pour le rectangle periode 3
 $couleur_barre_degrade_defaut [4] = 0 ; // Activation du degrade pour le rectangle periode 4
 $couleur_barre_degrade_defaut [5] = 0 ; // Activation du degrade pour le rectangle periode 5
 $couleur_barre_degrade_defaut [6] = 0 ; // Activation du degrade pour le rectangle periode 6
 
 $couleur_barre_degrade_finale_defaut [1] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 1 (a gauche)
 $couleur_barre_degrade_finale_defaut [2] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 2 (a gauche)
 $couleur_barre_degrade_finale_defaut [3] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 3 (a gauche)
 $couleur_barre_degrade_finale_defaut [4] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 4 (a gauche)
 $couleur_barre_degrade_finale_defaut [5] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 5 (a gauche)
 $couleur_barre_degrade_finale_defaut [6] = "#ffffff" ; // Couleur finale du degrade pour le rectangle periode 6 (a gauche)
 
 $couleur_barre_compare_defaut [1] = "#8F9AF7" ; // Couleur rectangle comparaison periode 1
 $couleur_barre_compare_defaut [2] = "#FF6500" ; // Couleur rectangle comparaison periode 2
 $couleur_barre_compare_defaut [3] = "#FEEDB6" ; // Couleur rectangle comparaison periode 3
 $couleur_barre_compare_defaut [4] = "#60AAF4" ; // Couleur rectangle comparaison periode 4
 $couleur_barre_compare_defaut [5] = "#8BEDFF" ; // Couleur rectangle comparaison periode 5
 $couleur_barre_compare_defaut [6] = "#FFCB00" ; // Couleur rectangle comparaison periode 6
 
 $couleur_barre_compare_degrade_defaut [1] = 0 ; // Activation du degrade pour le rectangle comparaison periode 1
 $couleur_barre_compare_degrade_defaut [2] = 0 ; // Activation du degrade pour le rectangle comparaison periode 2
 $couleur_barre_compare_degrade_defaut [3] = 0 ; // Activation du degrade pour le rectangle comparaison periode 3
 $couleur_barre_compare_degrade_defaut [4] = 0 ; // Activation du degrade pour le rectangle comparaison periode 4
 $couleur_barre_compare_degrade_defaut [5] = 0 ; // Activation du degrade pour le rectangle comparaison periode 5
 $couleur_barre_compare_degrade_defaut [6] = 0 ; // Activation du degrade pour le rectangle comparaison periode 6
 
 $couleur_barre_compare_degrade_finale_defaut [1] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 1 (a droite)
 $couleur_barre_compare_degrade_finale_defaut [2] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 2 (a droite)
 $couleur_barre_compare_degrade_finale_defaut [3] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 3 (a droite)
 $couleur_barre_compare_degrade_finale_defaut [4] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 4 (a droite)
 $couleur_barre_compare_degrade_finale_defaut [5] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 5 (a droite)
 $couleur_barre_compare_degrade_finale_defaut [6] = "#ffffff" ; // Couleur finale du degrade pour le rectangle comparaison periode 6 (a droite)
 
 $couleur_barre_compare_point_defaut [1] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 1
 $couleur_barre_compare_point_defaut [2] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 2
 $couleur_barre_compare_point_defaut [3] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 3
 $couleur_barre_compare_point_defaut [4] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 4
 $couleur_barre_compare_point_defaut [5] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 5
 $couleur_barre_compare_point_defaut [6] = "#000000" ; // Couleur des points dans le rectangle comparaison periode 6
 
 $couleur_contour_barre_defaut [1] = "#000000" ; // Couleur contour rectangle periode 1
 $couleur_contour_barre_defaut [2] = "#000000" ; // Couleur contour rectangle periode 2
 $couleur_contour_barre_defaut [3] = "#000000" ; // Couleur contour rectangle periode 3
 $couleur_contour_barre_defaut [4] = "#000000" ; // Couleur contour rectangle periode 4
 $couleur_contour_barre_defaut [5] = "#000000" ; // Couleur contour rectangle periode 5
 $couleur_contour_barre_defaut [6] = "#000000" ; // Couleur contour rectangle periode 6
 
 $couleur_contour_barre_compare_defaut [1] = "#000000" ; // Couleur contour rectangle comparaison periode 1
 $couleur_contour_barre_compare_defaut [2] = "#000000" ; // Couleur contour rectangle comparaison periode 2
 $couleur_contour_barre_compare_defaut [3] = "#000000" ; // Couleur contour rectangle comparaison periode 3
 $couleur_contour_barre_compare_defaut [4] = "#000000" ; // Couleur contour rectangle comparaison periode 4
 $couleur_contour_barre_compare_defaut [5] = "#000000" ; // Couleur contour rectangle comparaison periode 5
 $couleur_contour_barre_compare_defaut [6] = "#000000" ; // Couleur contour rectangle comparaison periode 6
 
 // Type de graphique : Ligne avec et sans points
 $couleur_ligne_defaut [1] = "#0000FF" ; // Couleur ligne periode 1
 $couleur_ligne_defaut [2] = "#FF7700" ; // Couleur ligne periode 2
 $couleur_ligne_defaut [3] = "#FF00B6" ; // Couleur ligne periode 3
 $couleur_ligne_defaut [4] = "#60BCB4" ; // Couleur ligne periode 4
 $couleur_ligne_defaut [5] = "#8C00FF" ; // Couleur ligne periode 5
 $couleur_ligne_defaut [6] = "#FFDD00" ; // Couleur ligne periode 6
 
 $couleur_ligne_compare_defaut [1] = "#0000FF" ; // Couleur ligne comparaison periode 1
 $couleur_ligne_compare_defaut [2] = "#FF7700" ; // Couleur ligne comparaison periode 2
 $couleur_ligne_compare_defaut [3] = "#FF00B6" ; // Couleur ligne comparaison periode 3
 $couleur_ligne_compare_defaut [4] = "#60BCF4" ; // Couleur ligne comparaison periode 4
 $couleur_ligne_compare_defaut [5] = "#8C00FF" ; // Couleur ligne comparaison periode 5
 $couleur_ligne_compare_defaut [6] = "#FFDD00" ; // Couleur ligne comparaison periode 6
 
 // TYpe de graphique : Points
 $couleur_contour_point_defaut [1] = "#0000FF" ; // Couleur points periode 1
 $couleur_contour_point_defaut [2] = "#FF7700" ; // Couleur points periode 2
 $couleur_contour_point_defaut [3] = "#FF00B6" ; // Couleur points periode 3
 $couleur_contour_point_defaut [4] = "#60BCF4" ; // Couleur points periode 4
 $couleur_contour_point_defaut [5] = "#8C00FF" ; // Couleur points periode 5
 $couleur_contour_point_defaut [6] = "#FFDD00" ; // Couleur points periode 6
 
 $taille_point_defaut [1] = 7 ; // Taille des points
 $taille_point_defaut [2] = 7 ; // Taille des points
 $taille_point_defaut [3] = 7 ; // Taille des points
 $taille_point_defaut [4] = 7 ; // Taille des points
 $taille_point_defaut [5] = 7 ; // Taille des points
 $taille_point_defaut [6] = 7 ; // Taille des points
 
 $forme_point_defaut [1] = 1 ; // Forme des points
 $forme_point_defaut [2] = 3 ; // Forme des points
 $forme_point_defaut [3] = 2 ; // Forme des points
 $forme_point_defaut [4] = 1 ; // Forme des points
 $forme_point_defaut [5] = 3 ; // Forme des points
 $forme_point_defaut [6] = 2 ; // Forme des points
 
 $couleur_point_defaut [1] = "#0000FF" ; // Couleur point periode 1
 $couleur_point_defaut [2] = "#FF7700" ; // Couleur point periode 2
 $couleur_point_defaut [3] = "#FF00B6" ; // Couleur point periode 3
 $couleur_point_defaut [4] = "#60BCF4" ; // Couleur point periode 4
 $couleur_point_defaut [5] = "#8C00FF" ; // Couleur point periode 5
 $couleur_point_defaut [6] = "#FFDD00" ; // Couleur point periode 6
 
 $couleur_point_compare_defaut [1] = "#E6E7E6" ; // Couleur point comparaison periode 1
 $couleur_point_compare_defaut [2] = "#E6E7E6" ; // Couleur point comparaison periode 2
 $couleur_point_compare_defaut [3] = "#E6E7E6" ; // Couleur point comparaison periode 3
 $couleur_point_compare_defaut [4] = "#E6E7E6" ; // Couleur point comparaison periode 4
 $couleur_point_compare_defaut [5] = "#E6E7E6" ; // Couleur point comparaison periode 5
 $couleur_point_compare_defaut [6] = "#E6E7E6" ; // Couleur point comparaison periode 6
 
 $couleur_contour_point_compare_defaut [1] = "#0000FF" ; // Couleur contour point comparaison periode 1
 $couleur_contour_point_compare_defaut [2] = "#FF7700" ; // Couleur contour point comparaison periode 2
 $couleur_contour_point_compare_defaut [3] = "#FF00B6" ; // Couleur contour point comparaison periode 3
 $couleur_contour_point_compare_defaut [4] = "#60BCF4" ; // Couleur contour point comparaison periode 4
 $couleur_contour_point_compare_defaut [5] = "#8C00FF" ; // Couleur contour point comparaison periode 5
 $couleur_contour_point_compare_defaut [6] = "#FFDD00" ; // Couleur contour point comparaison periode 6
 
 $taille_point_compare_defaut [1] = 7 ; // Taille points comparaison periode 1
 $taille_point_compare_defaut [2] = 7 ; // Taille points comparaison periode 2
 $taille_point_compare_defaut [3] = 7 ; // Taille points comparaison periode 3
 $taille_point_compare_defaut [4] = 7 ; // Taille points comparaison periode 4
 $taille_point_compare_defaut [5] = 7 ; // Taille points comparaison periode 5
 $taille_point_compare_defaut [6] = 7 ; // Taille points comparaison periode 6
 
 $forme_point_compare_defaut [1] = 1 ; // Forme des points comparaison periode 1
 $forme_point_compare_defaut [2] = 3 ; // Forme des points comparaison periode 2
 $forme_point_compare_defaut [3] = 2 ; // Forme des points comparaison periode 3
 $forme_point_compare_defaut [4] = 1 ; // Forme des points comparaison periode 4
 $forme_point_compare_defaut [5] = 3 ; // Forme des points comparaison periode 5
 $forme_point_compare_defaut [6] = 2 ; // Forme des points comparaison periode 6
 
 $taille_point_seuls_defaut [1] = 10 ; // Taille des points seuls
 $taille_point_seuls_defaut [2] = 10 ; // Taille des points seuls
 $taille_point_seuls_defaut [3] = 10 ; // Taille des points seuls
 $taille_point_seuls_defaut [4] = 10 ; // Taille des points seuls
 $taille_point_seuls_defaut [5] = 10 ; // Taille des points seuls
 $taille_point_seuls_defaut [6] = 10 ; // Taille des points seuls
 $taille_point_seuls_compare_defaut = 10 ; // Taille des points seuls comparaison
 
 $forme_point_seuls_defaut [1] = 1 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 $forme_point_seuls_defaut [2] = 3 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 $forme_point_seuls_defaut [3] = 2 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 $forme_point_seuls_defaut [4] = 1 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 $forme_point_seuls_defaut [5] = 3 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 $forme_point_seuls_defaut [6] = 2 ; // Forme des points seuls 1=rond, 2=carre, 3=croix
 
 $forme_point_seuls_compare_defaut [1] = 1 ; // Forme des points seuls comparaison
 $forme_point_seuls_compare_defaut [2] = 3 ; // Forme des points seuls comparaison
 $forme_point_seuls_compare_defaut [3] = 2 ; // Forme des points seuls comparaison
 $forme_point_seuls_compare_defaut [4] = 1 ; // Forme des points seuls comparaison
 $forme_point_seuls_compare_defaut [5] = 3 ; // Forme des points seuls comparaison
 $forme_point_seuls_compare_defaut [6] = 2 ; // Forme des points seuls comparaison
 
 // Axes, grille, titre 
 $couleur_axes_defaut = "#000000" ; // Couleur des axes V et H
 $couleur_traits_horizontaux_defaut = "#CCCCCC" ; // Couleur traits H
 $couleur_traits_verticaux_defaut = "#CCCCCC" ; // Couleur traits V
 $couleur_trait_horizontal_indic_40_defaut = "#FF0000" ; // Couleur traits 40%max
 $couleur_trait_horizontal_moyenne_defaut = "#FF7700" ; // Couleur traits moyen
 $couleur_trait_horizontal_indic_60_defaut = "#2BA02B" ; // Couleur traits 60%max
 $couleur_fonte_defaut = "#FFFFFF" ; // Couleur fonte
 $couleur_titre_defaut = "#000000" ; // Couleur titre
 $couleur_titre_3d_defaut = "#AAAAAA" ; // Couleur onbre 3d titre
 $titre_3d = 1 ; // Couleur titre en 3D
 $taille_fonte_ordonnees_defaut = "3" ; // Taille fonte ordonnees
 $taille_fonte_matiere_defaut = "3" ; // Taille fonte matieres
 
 $taille_fonte_titre_defaut = "5" ; // Taille fonte titre
 $marge_gauche_defaut = 5 ; // Marge gauche
 $marge_droite_defaut = 10 ; // Marge droite
 $marge_bas_defaut = 5 ; // Marge bas
 $marge_haut_defaut = 5 ; // Marge haut
 $marge_titre_defaut = 10 ; // Marge titre
  
 $pas_graphe [0] = 5 ; // Nombre de pas
 $pas_graphe [1] = 2 ;// Pas d'affichage des graphes
 $pas_graphe [2] = 4 ;
 $pas_graphe [3] = 5 ;
 $pas_graphe [4] = 10 ;
 $pas_graphe [5] = 20 ;
 
 /**
 * Definition des noms des mois
 * @global array $nom_mois
 */
 $nom_mois [1] = "janvier" ;
 $nom_mois [2] = "f&eacute;vrier" ;
 $nom_mois [3] = "mars" ;
 $nom_mois [4] = "avril" ;
 $nom_mois [5] = "mai" ;
 $nom_mois [6] = "juin" ;
 $nom_mois [7] = "juillet" ;
 $nom_mois [8] = "ao&ucirc;t" ;
 $nom_mois [9] = "septembre" ;
 $nom_mois [10] = "octobre" ;
 $nom_mois [11] = "novembre" ;
 $nom_mois [12] = "d&eacute;cembre" ;
 
 /**
 * Definition des noms des mois avec la premiere lettre en majuscule
 * @global array $nom_mois_maj
 */
 $nom_mois_maj [1] = "Janvier" ;
 $nom_mois_maj [2] = "F&eacute;vrier" ;
 $nom_mois_maj [3] = "Mars" ;
 $nom_mois_maj [4] = "Avril" ;
 $nom_mois_maj [5] = "Mai" ;
 $nom_mois_maj [6] = "Juin" ;
 $nom_mois_maj [7] = "Juillet" ;
 $nom_mois_maj [8] = "Ao&ucirc;t" ;
 $nom_mois_maj [9] = "Septembre" ;
 $nom_mois_maj [10] = "Octobre" ;
 $nom_mois_maj [11] = "Novembre" ;
 $nom_mois_maj [12] = "D&eacute;cembre" ;
 
 /**
 * Definition des noms des jours
 * @global array $nom_jour
 */
 $nom_jour [0] = "dimanche" ;
 $nom_jour [1] = "lundi" ;
 $nom_jour [2] = "mardi" ;
 $nom_jour [3] = "mercredi" ;
 $nom_jour [4] = "jeudi" ;
 $nom_jour [5] = "vendredi" ;
 $nom_jour [6] = "samedi" ;
 
 /**
 * Definition des noms des jours avec la premiere lettre en majuscule
 * @global array $nom_jour_maj
 */
 $nom_jour_maj [0] = "Dimanche" ;
 $nom_jour_maj [1] = "Lundi" ;
 $nom_jour_maj [2] = "Mardi" ;
 $nom_jour_maj [3] = "Mercredi" ;
 $nom_jour_maj [4] = "Jeudi" ;
 $nom_jour_maj [5] = "Vendredi" ;
 $nom_jour_maj [6] = "Samedi" ;
 
 /**
 * Civilites
 * @global array $civilites
 */
 $civilites [0] = "Mme" ;
 $civilites [1] = "Mlle" ;
 $civilites [2] = "M." ;
 
 /**
 * Cahier de textes
 * @global string $cahier_texte_nom_unite
 * @global int $cahier_texte_coeff_multiplicateur
 */
 $cahier_texte_nom_unite = "k" ; // KiloOctets
 $cahier_texte_coeff_multiplicateur = 1024 ; // 1ko = 1024octets
 $texte_reglementaire = "R&eacute;f&eacute;rentiel G&eacute;n&eacute;ral d'Interop&eacute;rabilit&eacute; : Normes et recommandations V0.90 du 07 Avril 2006" ;

 /**
 * Definition des types de table pour changement eventuel
 * @global array $type_table
 */
 $type_table [0][0] = 4 ;
 $type_table [1][0] = "MYISAM" ;
 $type_table [1][1] = "MyISAM" ;
 $type_table [2][0] = "HEAP" ;
 $type_table [2][1] = "Heap" ;
 $type_table [3][0] = "BDB" ;
 $type_table [3][1] = "Berkeley Data Base" ;
 $type_table [4][0] = "ISAM" ;
 $type_table [4][1] = "ISAM" ;
 
 /**
 * Adresse du site de la cite scolaire Edouard Branly de Chatellerault pour la licence d'utilisation et le dictionnaire
 * @global array $adresse_etablissement_scolaire
 */
 $adresse_etablissement_scolaire [0][0] = 1 ;
 $adresse_etablissement_scolaire [1][0] = "jfcampan.free.fr" ;
 $adresse_etablissement_scolaire [1][1] = "/enregistrement/dictionnaire_fr.csv" ;
 $adresse_site [0][0] = 1 ; // Nombre
 $adresse_site [1][0] = "jfcampan.free.fr" ; // Adresse HTTP
 $adresse_site [1][1] = "/enregistrement/dictionnaire_fr.csv" ; // Acces dictionnaire
 $adresse_site [1][2] = "/enregistrement/enregistrement.php" ; // Acces enregistrement licence
 //$adresse_site [1][0] = "http://adullact.net" ; // Adresse HTTP
 //$adresse_site [1][1] = "/frs/download.php/1343/dictionnaire_fr.csv" ; // Acces dictionnaire
 //$adresse_site [1][2] = "/garennes/enregistrement/enregistrement.php" ; // Acces enregistrement licence
 
 /**
 * Adresse du site pour recuperation du flux rss
 */
 $adresse_flux_rss = "http://adullact.net/export/rss_sfnews.php" ;
 $identification_garennes = "<dc:subject>Garennes</dc:subject>" ;
 $affichage_rss [0][0] = 5 ;
 $affichage_rss [1][0] = "<title>" ;
 $affichage_rss [1][1] = "</title>" ;
 $affichage_rss [1][2] = 1 ; // A afficher en titre
 $affichage_rss [2][0] = "<link>" ;
 $affichage_rss [2][1] = "</link>" ;
 $affichage_rss [2][2] = 2 ; // Lien
 $affichage_rss [3][0] = "<description>" ;
 $affichage_rss [3][1] = "</description>" ;
 $affichage_rss [3][2] = 3 ; // Contenu
 $affichage_rss [4][0] = "<dc:creator>" ;
 $affichage_rss [4][1] = "</dc:creator>" ;
 $affichage_rss [4][2] = 4 ; // Signature
 $affichage_rss [5][0] = "<dc:date>" ;
 $affichage_rss [5][1] = "</dc:date>" ;
 $affichage_rss [5][2] = 5 ; // Date
 
 /**
 * Adresse mel du chef de projet
 * @global string $mel_chef_projet
 */
 $mel_chef_projet = "jean-francois.campan@ac-poitiers.fr" ;
 
 /**
 * Definition des differents separateurs pour importation CSV
 * @global array $separateurs
 */
 $separateurs [0][0] = 7 ;
 $separateurs [0][1] = 1 ;
 $separateurs [1][0] = ";" ; $separateurs [1][1] = "point virgule" ;
 $separateurs [2][0] = "," ; $separateurs [2][1] = "virgule" ;
 $separateurs [3][0] = ":" ; $separateurs [3][1] = "deux points" ;
 $separateurs [4][0] = "." ; $separateurs [4][1] = "point" ;
 $separateurs [5][0] = "-" ; $separateurs [5][1] = "tiret" ;
 $separateurs [6][0] = "=" ; $separateurs [6][1] = "&eacute;gal" ;
 $separateurs [7][0] = "_" ; $separateurs [7][1] = "underscore" ;
 
 /**
 * Definition des differents delimiteurs pour importation CSV
 * @global array $delimiteurs
 */
 $delimiteurs [0] = 4 ;
 $delimiteurs [1] = "Aucun" ;
 $delimiteurs [2] = Chr (34)." (guillemets)" ;
 $delimiteurs [3] = "' (c&ocirc;te gauche)" ;
 $delimiteurs [4] = "` (c&ocirc;te droite)" ;
 
 /**
 * Definition des differents format de date pour importation CSV
 * @global array $formats_date
 */
 $formats_date [0] = 8 ;
 $formats_date [1] = "AAAA-MM-JJ" ;
 $formats_date [2] = "AAAAMMJJ" ;
 $formats_date [3] = "AAAA/MM/JJ" ;
 $formats_date [4] = "JJ-MM-AAAA" ;
 $formats_date [5] = "JJMMAAAA" ;
 $formats_date [6] = "JJ/MM/AAAA" ;
 $formats_date [7] = "JJ/MM" ;
 $formats_date [8] = "JJ/MM/AA" ;
 
 /**
 * Definition des pre-formats de CSV
 * @global array $formats_csv
 */
 $formats_csv [0][0] = 2 ; // Nombre de formats
 $formats_csv [1][0] = "OpenOffice" ; // Nom du format
 $formats_csv [1][1] = 2 ; // Numero du separateur
 $formats_csv [1][2] = 2 ; // Numero du delimiteur
 $formats_csv [1][3] = 8 ; // Numero du format date
 
 $formats_csv [2][0] = "Excel" ; // Nom du format
 $formats_csv [2][1] = 1 ; // Numero du separateur
 $formats_csv [2][2] = 1 ; // Numero du delimiteur
 $formats_csv [2][3] = 6 ; // Format date
 
 /*
 $formats_csv [1][0] = "" ; // Nom du format
 $formats_csv [1][1] = ; // Numero du separateur
 $formats_csv [1][2] = ; // Numero du delimiteur
 $formats_csv [1][3] = ; // Format date
 */
 /**
 * Fonction qui recherche la "vraie" adresse IP du client connecte
 * @return string Adresse IP reelle du client
 */
 Function adresse_ip ()
  {
   If (IsSet ($_SERVER))
    {
     If (IsSet ($_SERVER ["HTTP_X_FORWARDED_FOR"])) { $ip_reelle = $_SERVER ["HTTP_X_FORWARDED_FOR"] ; }
     ElseIf (IsSet ($_SERVER["HTTP_CLIENT_IP"])) { $ip_reelle = $_SERVER ["HTTP_CLIENT_IP"] ; }
     Else { $ip_reelle = $_SERVER ["REMOTE_ADDR"] ; }
    }
   Else
    {
     If (GetEnv ("HTTP_X_FORWARDED_FOR")) { $ip_reelle = GetEnv ("HTTP_X_FORWARDED_FOR") ; }
     ElseIf (GetEnv("HTTP_CLIENT_IP") ) { $ip_reelle = GetEnv ("HTTP_CLIENT_IP") ; }
     Else { $ip_reelle = GetEnv ("REMOTE_ADDR") ; }
    }
   Return $ip_reelle ;
  }
 
 // ==========================================================================================================
 // Gestion SQL
 // -------------------------------------------------------------------------------
 /**
 * Fonction de connexion et de selection de base de donnees.
 * @param string $ordi Nom du serveur SQL
 * @param string $user Identifiant de connexion SQL
 * @param string $pass Mot de passe SQL
 * @param string $basedd Nom de la base de donnees SQL
 * @return mixed Numero de la connexion SQL
 */
 Function SQL_connexion ($ordi, $user, $pass, $basedd, $port)
  {
   Global $type_bdd, $debug_journal ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : If (($port > 0) Or ($port != "")) { $lien = @MySQL_Connect ($ordi.":".$port, $user, $pass) ; }
                         Else { $lien = @MySQL_Connect ($ordi, $user, $pass) ; }
                         $ok = @MySQL_Select_DB ($basedd) ;
                         If (($lien) And ($debug_journal == 1)) { $ok = @MySQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','--DEBUT-SESSION--','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $lien) ; }
		         Break ;;
     Case "mSQL"       : $lien = @mSQL_PConnect ($ordi) ;
                         @mSQL_Select_DB ($basedd) ;
                         If (($lien) And ($debug_journal == 1)) { $ok = @mSQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','--DEBUT-SESSION--','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $lien) ; }
                         Break ;;
     Case "PostgreSQL" : $lien = @PG_PConnect ("host=".$ordi." user=".$user." password=".$pass." port=".$port." dbname=".$basedd) ;
                         If (($lien) And ($debug_journal == 1)) { $ok = @PG_Query ($lien,"INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','--DEBUT-SESSION--','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')") ; }
                         Break ;;
     Default           : If (($port > 0) Or ($port != "")) { $lien = @MySQL_Connect ($ordi.":".$port, $user, $pass) ; }
                         Else { $lien = @MySQL_Connect ($ordi, $user, $pass) ; }
                         @MySQL_Select_DB ($basedd) ;
                         If (($lien) And ($debug_journal == 1)) { $ok = @MySQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','--DEBUT-SESSION--','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $lien) ; }
                         Break ;;
    }
   If (!$lien) { Echo "<center>".$ok."</center><br>" ; SQL_erreur (3) ; }
   Return $lien ;
  }

 /**
 * Fonction d'etabliseement de connexion.
 * @param string $ordi Nom du serveur SQL
 * @param string $user Identifiant de connexion SQL
 * @param string $pass Mot de passe SQL
 * @param string $port Numero de port SQL
 * @return mixed Numero de la connexion SQL
 */
 Function SQL_etablissement_connexion ($ordi, $user, $pass, $port)
  {
   Global $type_bdd ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : If (($port > 0) Or ($port != "")) { $lien = @MySQL_PConnect ($ordi.":".$port, $user, $pass) ; }
                         Else { $lien = @MySQL_PConnect ($ordi, $user, $pass) ; }
                         Break ;;
     Case "mSQL"       : $lien = @mSQL_PConnect ($ordi) ;
                         Break ;;
     Case "PostgreSQL" : $lien = @PG_PConnect ("host=".$ordi." user=".$user." password=".$pass." port=".$port." dbname=template1") ;
                         Break ;;
     Default           : If (($port > 0) Or ($port != "")) { $lien = @MySQL_PConnect ($ordi.":".$port, $user, $pass) ; }
                         Else { $lien = @MySQL_PConnect ($ordi, $user, $pass) ; }
                         Break ;;
    }
   Return $lien ;
  }

 /**
 * Fonction de selection de base de donnees uniquement.
 * @param string $basedd Nom de la base de donnees SQL
 * @param string $id Numero de la connexion SQL
 * @return mixed Selection reussi ou pas
 */
 Function SQL_selection_bd ($basedd, $id)
  {
   Global $type_bdd, $sql_adresse, $sql_qui, $sql_passe, $sql_port ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $selection = @MySQL_Select_DB ($basedd, $id) ;
                         Break ;;
     Case "mSQL"       : $selection = @mSQL_Select_DB ($basedd, $id) ;
                         Break ;;
     Case "PostgreSQL" : $selection = @PG_PConnect ("host=".$sql_adresse." user=".$sql_qui." password=".$sql_passe." port=".$sql_port." dbname=".$basedd) ;
                         Break ;;
     Default           : $selection = @MySQL_Select_DB ($basedd) ;
                         Break ;;
    }
   Return $selection ;
  }

 /**
 * Execute une commande SQL.
 * @param string $commande Commande en syntaxe SQL
 * @param string $id Numero de la connexion SQL
 * @return mixed Resultat de la requete SQL
 */
 Function SQL_commande ($commande, $id)
  {
   Global $type_bdd,$debug_SQL,$debug_journal,$debug_simulation ;
   If (($debug_SQL != 0) Or ($debug_simulation != 0)) { Echo "Commande SQL : ".$commande."<br>" ; }
   If ($debug_simulation == 0)
    {
     Switch ($type_bdd)
      {
       Case "MySQL"      : $res = @MySQL_Query ($commande, $id) ;
                           If ($debug_journal == 1) { $ok = @MySQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','".Str_Replace ("'", "\'", $commande)."','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $id) ; }
                           Break ;;
       Case "mSQL"       : $res = @mSQL_Query ($commande, $id) ;
                           If ($debug_journal == 1) { $ok = @mSQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','".Str_Replace ("'", "\'", $commande)."','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $id) ; }
                           Break ;;
       Case "PostgreSQL" : $res = @PG_Query ($id, $commande) ;
                           If ($debug_journal == 1) { $ok = @PG_Query ($id, "INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','".Str_Replace ("'", "\'", $commande)."','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')") ; }
                           Break ;;
       Default           : $res = @MySQL_Query ($commande, $id) ;
                           If ($debug_journal == 1) { $ok = @MySQL_Query ("INSERT INTO journal (texte,script,date,adresse) VALUES ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."','".Str_Replace ("'", "\'", $commande)."','".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $id) ; }
                           Break ;;
      }
    }
   If (($debug_SQL != 0) Or ($debug_simulation != 0)) { Echo "Erreur SQL : <font color=\"#ff0000\"><b>".SQL_message_erreur ($id)."</b></font><br>" ; }
   Return $res ;
  }

 /**
 * Retourne le nombre de lignes.
 * @param string $resultat Un resultat d'une commande SQL precedente
 * @return int Nombre de lignes du resultat
 */
 Function SQL_nbr_lignes ($resultat)

  {
   Global $type_bdd ;
   Global $debug_SQL ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $ligne = @MySQL_Num_Rows ($resultat) ;
                         Break ;;
     Case "mSQL"       : $ligne = @mSQL_Num_Rows ($resultat) ;
                         Break ;;
     Case "PostgreSQL" : $ligne = @PG_Num_Rows ($resultat) ;
                         Break ;;
     Default           : $ligne = @MySQL_Num_Rows ($resultat) ;
                         Break ;;
    }
   If ($debug_SQL) { Echo "Nombre de lignes : ".$ligne."<br>" ; }
   Return $ligne ;
  }

 /**
 * Retourne le nombre de champs.
 * @param string $resultat Un resultat d'une commande SQL precedente
 * @return int Nombre de champs du resultat
 */
 Function SQL_nbr_champs ($resultat)

  {
   Global $type_bdd ;
   Global $debug_SQL ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $ligne = @MySQL_Num_Fields ($resultat) ;
                         Break ;;
     Case "mSQL"       : $ligne = @mSQL_Num_Fields ($resultat) ;
                         Break ;;
     Case "PostgreSQL" : $ligne = @PG_Num_Fields ($resultat) ;
                         Break ;;
     Default           : $ligne = @MySQL_Num_Fields ($resultat) ;
                         Break ;;
    }
   If ($debug_SQL) { Echo "Nombre de champs : ".$ligne."<br>" ; }
   Return $ligne ;
  }
 
 /**
 * Retourne le nom d'un champs.
 * @param string $resultat Un resultat d'une commande SQL precedente
 * @param string $num Numero du champ dont on veut le nom
 * @return string Nom du champs
 */
 Function SQL_nom_champs ($resultat, $num)

  {
   Global $type_bdd ;
   Global $debug_SQL ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $ligne = @MySQL_Field_name ($resultat, $num) ;
                         Break ;;
     Case "mSQL"       : $ligne = @mSQL_FieldName ($resultat) ;
                         Break ;;
     Case "PostgreSQL" : $ligne = @PG_Field_Name ($resultat) ;
                         Break ;;
     Default           : $ligne = @MySQL_Field_Name ($resultat) ;
                         Break ;;
    }
   If ($debug_SQL) { Echo "Nom du champs ".$num." : ".$ligne."<br>" ; }
   Return $ligne ;
  }

 /**
 * Renvoi la ligne suivante du resultat
 * @param string $resultat Un resultat d'une commande SQL precedente
 * @return array Enregistrement suivant dans un table numerote
 */
 Function SQL_ligne_suivante ($resultat)
  {
   Global $type_bdd ;
   Switch ($type_bdd)
    {
     Case "MySQL"     : $ligne = array () ;
                        $ligne = @MySQL_Fetch_Row ($resultat) ;
                        Break ;;
     Case "mSQL"      : $ligne = array () ;
                        $ligne = @mSQL_Fetch_Row ($resultat) ;
                        Break ;;
     Case "PostgreSQL": $ligne = array () ;
                        $ligne = @PG_Fetch_Row ($resultat) ;
                        Break ;;
     Default          : $ligne = array () ;
                        $ligne = @MySQL_Fetch_Row ($resultat) ;
                        Break ;;
    }
   Return $ligne ;
  }

 /**
 * Fonction qui renvoi un tableau associatif contenant les attributs
 * de la ligne courante, et positionne le curseur sur la ligne suivante
 * @param string $res Un resultat d'une commande SQL precedente
 * @param string $nr
 * @return array Enregistrement suivant dans un table associatif
 */
 Function SQL_tableau_associatif ($res, $nr)
  {
   Global $type_bdd ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $row = array () ;
                         $row = @MySQL_Fetch_Array ($res) ;
                         Return $row ;
                         Break ;;
     Case "mSQL"       : $row = array () ;
                         $row = @MSQL_Fetch_Array ($res) ;
                         Return $row ;
                         Break ;;
     Case "PostgreSQL" : $row = array () ;
                         $row = @PG_Fetch_Array ($res,$nr) ;
                         Return $row ;
                         Break;;
     Default           : $row = array () ;
                         $row = @MySQL_Fetch_Array ($res) ;
                         Return $row ;
                         Break ;;
    }
  }

 /**
 * Fonction qui retourne le dernier id genere
 * @param string $table Nom de la table a tester
 * @param string $nom Nom du champ considere
 * @param string $res_id Numero de la connexion SQL
 * @return int Valeur maximale du champs considere
 */
 Function SQL_dernier_id ($table, $nom, $res_id)
  {
   $requete = "SELECT max(".$nom.") FROM ".$table ;
   $res = SQL_commande ($requete, $res_id) ;
   $r = SQL_ligne_suivante ($res) ;
   Return $r [0] ;
   /*
   Global $type_bdd ;
   switch ($type_bdd)
    {
     Case "MySQL"      : $res=@mysql_insert_id ($res_id) ;
                         Return $res ;
                         Break ;;
     Case "mSQL"       : $res = @MSQL_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
     Case "PostgreSQL" : $res = @PG_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
     Default           : $res = @MySQL_Insert_ID ($res_id) ;
                         Return $res ;
                         Break ;;
    }
   */
  }

 /**
 * Fonction qui permet d'acceder directement a l'attribut $mix de la ligne $row
 * @param string $res_id Numero de la connexion SQL
 * @param string $row Ligne courante
 * @param string $mix Nom de l'atribut
 * @return mixed Resultat de l'acces
 */
 Function SQL_acces_attribut ($res_id, $row, $mix)
  {
   Global $type_bdd ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $res = @MySQL_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
     Case "mSQL"       : $res = @MSQL_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
     Case "PostgreSQL" : $res = @PG_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
     Default           : $res = MySQL_Result ($res_id, $row, $mix) ;
                         Return $res ;
                         Break ;;
    }
  }

 /**
 * Positionne a la fin d'un enregistrement
 * @param string $res Un resultat d'une commande SQL precedente
 * @return array Dernier enregistrement
 */
 Function SQL_positionne_fin ($resultat)
  {
   Global $type_bdd ;
   Global $debug_SQL ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $ok = @MySQL_Field_Seek ($resultat) ;
                         Break ;;
     Case "mSQL"       : Break ;;
     Case "PostgreSQL" : Break ;;
     Default           : $ok = @MySQL_Field_Seek ($resultat) ;
                         Break ;;
    }
   Return $resultat ;
  }

 /**
 * Fermeture d'une connexion SQL
 * @param mixed $id Numero de la connexion SQL
 * @return mixed Booleen indiquant si la fermeture s'est bien passee
 */
 Function SQL_fermeture ($id)
  {
   Global $type_bdd ;
   Global $debug_SQL ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $res = @MySQL_Close ($id) ;
                         Break ;;
     Case "mSQL"       : $res = @mSQL_Close ($id) ;
                         Break ;;
     Case "PostgreSQL" : $res = @PG_Close ($id) ;
                         Break ;;
     Default           : $res = @MySQL_Close ($id) ;
                         Break ;;
    }
   Return $res ;
  }

 /**
 * Fonction permettant d'avoir les erreurs SQL
 * @param mixed $id Numero de la connexion SQL
 * @return string Erreur du SQL
 */
 Function SQL_message_erreur ($id)
  {
   Global $type_bdd ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : $ligne = MySQL_Error() ; Break ;;
     Case "mSQL"       : $ligne = MSQL_Error () ; Break ;;
     Case "PostgreSQL" : $ligne = PG_Last_Error ($id) ; Break ;;
     Default           : $ligne = MySQL_Error () ; Break ;;
    }
   Return $ligne ;
  }

 /**
 * Fonction d'affichage des erreurs
 * @param int $numero Numero de l'erreur a afficher
 */
 Function SQL_erreur ($numero)
  {
   Global $type_bdd, $version_garennes, $http_garennes ;
   $message [1] = "Erreur de connexion au serveur de base de donn&eacute;es" ;
   $message [2] = "Message renvoy&eacute; par le serveur :" ;
   $message [3] = "Probl&egrave;me de connexion au serveur ".$type_bdd ;
   $message [4] = "Il peut &ecirc;tre coup&eacute;, ou en maintenance..." ;
   Echo "<html>" ;
   Echo "<title>".$message [1]." : ".$message [$numero]."</title>" ;
   Echo "<body bgcolor=\"#FFFFFF\" text=\"#000000\" background=\"".$http_garennes."/images/fond.png\">" ;
   Echo "<center><img src=\"".$http_garennes."/images/logo.png\" border=\"0\">v".$version_garennes."<br><h1>".$message [1]."</h1><hr>" ;
   Echo $message [$numero]."<br>Raisons possibles : ".$message [4] ;
   Echo "<hr><b>".$message [2]."<br>" ;
   Switch ($type_bdd)
    {
     Case "MySQL"      : Echo MySQL_Error() ;
                         Break ;;
     Case "mSQL"       : Echo MSQL_Error () ;
                         Break ;;
     Case "PostgreSQL" : Echo PG_Last_Error ($id) ;
                         Break ;;
     Default           : Echo MySQL_Error () ;
                         Break ;;
    }
   Echo "</b><hr></body></html>" ;
   Exit ;
  }

 /**
 * Fonction de chargement d'une table SQL
 * @param string $nom_fichier Emplacement et nom du fichier a charger
 * @param mixed $id Numero de la connexion SQL
 * @return mixed Booleen indiquant si le chargement s'est bien passee
 */
 Function SQL_charge_table ($nom_fichier, $id)
  {
   Global $debug_fonction ;
   $requete = File ($nom_fichier) ;
   For ($i = 0 ; $i < SizeOf ($requete) ; $i++)
    {
     If ((SubStr ($requete [$i], 0, 1) != "#") And (Chop ($requete [$i]) != ""))
      {
       If ($debug_fonction) { Echo "REQUETE = ".Chop ($requete [$i])."<br>" ; }
       $resultats = SQL_commande (Chop ($requete [$i]), $id) ;
      }
    }
  }

 /**
 * Gestion des types de caracteres a transmettre ou transmis au serveur SQL
 * @param int $mode Mode de transmission (1=Ascendance (client),2=Descendance normale,4=Descendance PDF)
 */
 Function SQL_transmission ($mode)
  {
   Global $id_sql, $type_bdd, $caracteres_client_SQL, $caracteres_serveur_SQL, $caracteres_document_PDF, $caracteres_client_nav, $debug_SQL ;
   $caracteres_client_serveur_SQL = restaure_configuration_defaut ("SYSTEME_PARAM", "GENERAL", "JEU_WEB_SQL", $caracteres_client_SQL) ;
   $caracteres_serveur_SQL_client = restaure_configuration_defaut ("SYSTEME_PARAM", "GENERAL", "JEU_SQL_WEB", $caracteres_serveur_SQL) ;
   $caracteres_serveur_SQL_document_PDF = restaure_configuration_defaut ("SYSTEME_PARAM", "GENERAL", "JEU_SQL_PDF", $caracteres_document_PDF) ;
   //$caracteres_client_navigateur = restaure_configuration ("SYSTEME_PARAM", "GENERAL", "JEU_WEB_NAV", $caracteres_client_nav) ;
   If ($type_bdd == "MySQL")
    {
     If (($caracteres_client_serveur_SQL != "AUCUN") And (($mode == 1) Or ($mode == 3) Or ($mode == 5) Or ($mode == 7)))
      {
       $ok = SQL_commande ("SET character_set_client='".$caracteres_client_serveur_SQL."'", $id_sql) ;
       $ok = SQL_commande ("SET character_set_connection='".$caracteres_client_serveur_SQL."'", $id_sql) ;
      }
     If (($caracteres_serveur_SQL_client != "AUCUN") And (($mode == 2) Or ($mode == 3) Or ($mode == 6) Or ($mode == 7)))
      { $ok = SQL_commande ("SET character_set_results='".$caracteres_serveur_SQL_client."'", $id_sql) ; }
     If (($caracteres_serveur_SQL_document_PDF != "AUCUN") And (($mode == 4) Or ($mode == 5) Or ($mode == 6) Or ($mode == 7)))
      { $ok = SQL_commande ("SET character_set_results='".$caracteres_serveur_SQL_document_PDF."'", $id_sql) ; }
    }
  }

 /**
 * Fonction qui renvoi un champ en particulier
 * @param string $s Nom du serveur SQL
 * @param string $u Identifiant de connexion SQL
 * @param string $p Mot de passe SQL
 * @param string $bdd Nom de la base de donnees
 * @param array $table Table de travail
 * @param int $num_enreg Numero de l'enregistrement
 * @param int $c Numero du champs a retourner
 * @return mixed Tableau associatif contenu du champs
 */
 Function valeur_champ ($s, $u, $p, $bdd, $table, $num_enreg)
  {
   Global $debug_fonction ;
   $id = SQL_connexion ($s, $u, $p, $bdd) ;
   $requete = "SELECT * FROM ".$table." WHERE id='".$num_enreg."'" ;
   $resultat = SQL_commande ($requete, $id) ;
   $ok = SQL_fermeture ($id) ;
   $r = SQL_tableau_associatif ($resultat, "") ;
   If ($debug_fonction) { Echo $requete."-&gt;".$table."-".$num_enreg."=".$resultat."-".$r ["id"]."<br>" ; }
   Return $r ;
  }

 // ==========================================================================================================
 //  GESTION CONNEXIONS
 // -------------------------------------------------------------------------------
 Function connexion_bdd ($adresse1,$adresse2,$adresse3,$qui,$passe,$base,$port,$timeout)
  {
   // Essai de connexion sans port
   $id_s = SQL_connexion ($adresse1, $qui, $passe, $base, "") ;
   If (!$id_s)
    {
     If ($f = @FSockOpen ($adresse1, $port, $errno, $errstr, $timeout))
      {
       FClose ($f) ;
       // Essai de connexion avec port
       $id_s = SQL_connexion ($adresse1, $qui, $passe, $base, $port) ;
       If (!$id_s)
        {
         If ($adresse2 != "")
          {
           // Test le serveur secondaire si existe
           If ($f = @FSockOpen ($adresse2, $port, $errno, $errstr, $timeout))
            {
             FClose ($f) ;
             $id_s = SQL_connexion ($adresse2, $qui, $passe, $base, $port) ;
            }
           ElseIf ($adresse3 != "")
            {
             // Test le serveur tertiaire si existe
             If ($f = @FSockOpen ($adresse3, $port, $errno, $errstr, $timeout))
              {
               FClose ($f) ;
               $id_sql = SQL_connexion ($adresse3, $qui, $passe, $base, $port) ;
              }
            }
          }
        }
      }
    }
   If (IsSet ($id_s)) { Return $id_s ; } Else { Return Null ; }
  }

 /**
 * Fonction qui test si la presence dans la base de donnees d'une table de nom $nom
 * @param string $nom Nom de la table
 * @param mixed $id_sql Identifiant de connexion SQL
 * @return int 0=Non Presente, 1=Presente
 */
 Function test_presence_table ($nom, $id_sql)
  {
   $ok = 0 ;
   $res = SQL_commande ("SHOW TABLES", $id_sql) ;
   $nbr_res = SQL_nbr_lignes ($res) ;
   If ($nbr_res > 0)
    {
     For ($i = 0 ; $i < $nbr_res ; $i++)
      {
       $r = SQL_ligne_suivante ($res) ;
       If ($r [0] == $nom) { $ok = 1 ; }
      }
    }
   Return $ok  ;
  }

 /**
 * Fonction qui test si le champ $nom_champ est present dans la table $nom_table de la base de donnees
 * @param string $nom_table Nom de la table
 * @param string $nom_champ Nom du champ de cette table
 * @param mixed $id_sql Identifiant de connexion SQL
 * @return int 0=Non present, 1=Present
 */
 Function test_presence_champ ($nom_table, $nom_champ, $id_sql)
  {
   $res = SQL_commande ("SELECT ".$nom_champ." FROM ".$nom_table." LIMIT 1", $id_sql) ;
   Return SQL_nbr_lignes ($res) ;
  }

 /**
 * Fonction qui test si le champ $nom_champ est present dans la table $nom_table de la base de donnees
 * @param string $nom_table Nom de la table
 * @param string $nom_champ Nom du champ de cette table
 * @param string $condition Condition d'obtention de l'enregistrement
 * @param mixed $id_sql Identifiant de connexion SQL
 * @return mixed -1=Aucun sinon valeur du champ
 */
 Function test_presence_champ_valeur ($nom_table, $nom_champ, $condition, $id_sql)
  {
   $res = SQL_commande ("SELECT ".$nom_champ." FROM ".$nom_table." WHERE ".$condition." LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1) { $r = SQL_ligne_suivante ($res) ; Return $r [0] ; }
   Else { Return "-1" ; }
  }

 /**
 * Fonction qui test si le champ $nom_champ de la table $nom_table contient $valeur
 * @param string $nom_table Nom de la table
 * @param string $nom_champ Nom du champ de cette table
 * @param string $condition Condition d'obtention de la valeur cherchee
 * @param string $valeur Valeur a comparer
 * @param mixed $id_sql Identifiant de connexion SQL
 * @return int 0=Pas de droits, 1=Droit d'ecriture
 */
 Function test_presence_contenu ($nom_table, $nom_champ, $condition , $valeur, $id_sql)
  {
   $ok = 0 ;
   $res = SQL_commande ("SELECT ".$nom_champ." FROM ".$nom_table." WHERE ".$condition." LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     $r = SQL_ligne_suivante ($res) ;
     If ($r [0] == $valeur) { $ok = 1 ; }
    }
   Return $ok  ;
  }

 // ==========================================================================================================
 //  GESTION DES DATES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi le millesime avec decalage ou pas
 * @param int $decalage Decalage par rapport a l'annee courante
 * @return int Millesime-Decalage-Delta_millesime (si existe) sinon annee courante
 */
 Function millesime ($decalage)
  {
   Global $id_sql, $delta_millesime ;
   $resultat = SQL_commande ("SELECT millesime FROM gestion ORDER BY millesime DESC LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $r = SQL_ligne_suivante ($resultat) ;
     $m = $r [0]-$decalage ;
     If (IsSet ($delta_millesime)) { $m -= $delta_millesime ; }
    }
   Else { $m = Date ("Y") ; }
   Return $m ;
  }

 /**
 * Renvoi le dernier millesime sans prendre en compte le decalage
 * @return int Millesime annee courante reel
 */
 Function millesime_reel ()
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT millesime FROM gestion ORDER BY millesime DESC LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $r = SQL_ligne_suivante ($resultat) ;
     $m = $r [0] ;
    }
   Else { $m = Date ("Y") ; }
   Return $m ;
  }

 /**
 * Renvoi l'identifiant du millesime courant
 * @return int Id millesime
 */
 Function id_millesime ($annee)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_gestion FROM gestion WHERE millesime='".$annee."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { $r = SQL_ligne_suivante ($resultat) ; } Else { $r [0] = 0 ; }
   Return $r [0] ;
  }

 /**
 * Renvoi la date et heure courantes sous le format : AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function date_heure ()
  {
   Return Date ("Y-m-d H:i:s", Time ()) ;
  }

 /**
 * Traduction d'une date JJ/MM/AAAA en AAAA-MM-JJ
 * @param string $madate Date a traduire en format JJ/MM/AAAA
 * @return string Date formattee
 */
 Function encode_date ($madate)
  {
   $table = Explode ("/", $madate) ;
   $madate = $table [2]."-".$table [1]."-".$table [0] ;
   Return $madate ;
  }

 /**
 * Traduction d'une date AAAA-MM-JJ en JJ/MM/AAAA
 * @param string $madate Date a traduire en format AAAA-MM-JJ
 * @return string Date formattee
 */
 Function decode_date_1 ($madate)
  {
   If (StrPos ($madate, " ")) { $table = Explode (" ", $madate) ; $table = Explode ("-", $table [0]) ; }
   Else { $table = Explode ("-", $madate) ; }
   $madate = $table [2]."/".$table [1]."/".$table [0] ;
   Return $madate ;
  }

 /**
 * Traduction d'une date/heure AAAA-MM-JJ HH:MM:SS en JJ/MM
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function decode_date_2 ($madate)
  {
   $table = Explode (" ", $madate) ;
   $madate = $table [0] ;
   $table = Explode ("-", $madate) ;
   Return "$table[2]/$table[1]" ;
  }

 /**
 * Traduction d'une date/heure AAAA-MM-JJ HH:MM:SS en jour mois annee avec des espace differents de &nbsp;
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function decode_date_3 ($madate)
  {
   $nom_mois [1] = "janvier" ;
   $nom_mois [2] = "f�vrier" ;
   $nom_mois [3] = "mars" ;
   $nom_mois [4] = "avril" ;
   $nom_mois [5] = "mai" ;
   $nom_mois [6] = "juin" ;
   $nom_mois [7] = "juillet" ;
   $nom_mois [8] = "ao�t" ;
   $nom_mois [9] = "septembre" ;
   $nom_mois [10] = "octobre" ;
   $nom_mois [11] = "novembre" ;
   $nom_mois [12] = "d�cembre" ;
   $table = Explode ("-", $madate) ;
   Return ($table [2]." ".$nom_mois [(int)$table [1]]." ".$table[0]) ;
  }

 /**
 * Traduction d'une date/heure AAAA-MM-JJ HH:MM:SS en jour mois annee avec des espace &nbsp;
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function decode_date_4 ($madate)
  {
   $nom_mois [1] = "janvier" ;
   $nom_mois [2] = "f&eacute;vrier" ;
   $nom_mois [3] = "mars" ;
   $nom_mois [4] = "avril" ;
   $nom_mois [5] = "mai" ;
   $nom_mois [6] = "juin" ;
   $nom_mois [7] = "juillet" ;
   $nom_mois [8] = "ao&ucirc;t" ;
   $nom_mois [9] = "septembre" ;
   $nom_mois [10] = "octobre" ;
   $nom_mois [11] = "novembre" ;
   $nom_mois [12] = "d&eacute;cembre" ;
   $madate2 = Explode (" ", $madate) ;
   $table = Explode ("-", $madate2 [0]) ;
   Return ($table [2]."&nbsp;".$nom_mois [(int)$table [1]]."&nbsp;".$table[0]) ;
  }

 /**
 * Traduction d'une date/heure AAAA-MM-JJ HH:MM:SS en heure minute avec des espace &nbsp;
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function decode_date_5 ($madate)
  {
   $madate2 = Explode (" ", $madate) ;
   $table = Explode (":", $madate2 [1]) ;
   Return ($table [0]."H".$table [1]) ;
  }
 
 /**
 * Traduction d'une heure HH:MM:SS en hhHmm
 * @param string $heure Haure a traduire en HH:MM:SS
 * @return string Heure formattee
 */
 Function decode_date_6 ($heure)
  {
   $h2 = Explode (":", $heure) ;
   Return ($h2 [0]."H".$h2 [1]) ;
  }

 /**
 * Traduction d'une date/heure AAAA-MM-JJ HH:MM:SS en JJ/MM/AAAA
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @return string Date formattee
 */
 Function decode_date_mysql ($madate)
  {
   $madate = SubStr ($madate, 0, 10) ;
   $table = Explode ("-", $madate) ;
   Return ("$table[2]/$table[1]/$table[0]") ;
  }
 
 /**
 * Renvoie une date en francais jour mois annee format HTML
 * @param string $madate Date a traduire en format AAAA-MM-JJ ou AAAA-MM-JJ HH:II:SS
 * @return string Date formattee
 */
 Function affiche_date ($madate)
  {
   Global $nom_mois ;
   $madate2 = Explode (" ", $madate) ;
   $table = Explode ("-", SubStr ($madate2 [0], 0, 10)) ;
   Return ($table [2]."&nbsp;".$nom_mois [(int)$table [1]]."&nbsp;".$table[0]) ;
  }
 
 /**
 * Renvoi le nom du jour d'une date/heure AAAA-MM-JJ HH:MM:SS
 * @param string $madate Date a traduire en format AAAA-MM-JJ HH:MM:SS
 * @param int $mode Mode de formattage en sortie (0:Aucun, 1:Premier lettre en majuscule)
 * @return string Nom du jour en format HTML
 */
 Function jour_html ($madate, $mode)
  {
   Global $nom_jour ;
   $d1 = Explode (" ", $madate) ;
   $d2 = Explode ("-", $d1 [0]) ;
   $d3 = Explode (":", $d1 [1]) ;
   $nj = $nom_jour [(integer)Date ("w", MkTime ($d3 [0],$d3 [1],$d3 [2],$d2 [1],$d2 [2],$d2 [0]))] ;
   Switch ($mode)
    {
     Default : Break ;
      Case 1 : $nj = StrToUpper (SubStr ($nj, 0, 1)).SubStr ($nj, 1, StrLen ($nj)-1) ; Break ;
    }
   Return $nj ;
  }
 
 /**
 * Calcul la difference entre deux dates
 * @param string $date1 Date 1 au format YYYY-MM-JJ
 * @param string $date2 Date 2 au format YYYY-MM-JJ
 * @return double Valeur numerique en unite precisee par mode
 */
 Function difference_dates ($date1, $date2)
  {
   $d1 = Explode ($date1, "-") ;
   $d2 = Explode ($date2, "-") ;
   $dt1 = MkTime (0, 0, 0, $d1 [1], $d1 [2], $d1 [0], -1) ;
   $dt2 = MkTime (0, 0, 0, $d2 [1], $d2 [2], $d2 [0], -1) ;
   If ($dt1 > $dt2) { $diff = $dt1-$dt2 ; } Else { $diff = $dt2-$dt1 ; }
   $nbr_jours = $diff/(24*60*60*60) ;
   Return $nbr_jours ;
  }
 
 // ==========================================================================================================
 //  GESTION DES DROITS
 // -------------------------------------------------------------------------------
 /**
 * Authentification
 * @param int $mode Type d'authentification (1=Interne, 2=SQL, 3=LDAP)
 * @param string $identifiant Identifiant (login)
 * @param string $mot_passe Mode de passe (password)
 * @return int Droit si OK sinon $aucun_droit
 *    ou
 * @return array [0]=Droit,[1]=Passe si OK sinon [0]=$aucun_droit
 */
 Function authentification ($mode, $identifiant, $mot_passe)
  {
   Global $id_sql,$aucun_droit,$droit_eleve,$droit_cahier_textes,$droit_secretariat,$droit_direction,$droit_admin ;
   Global $droit_supervision,$multi_etablissement,$multi_bases,$cahier_textes_id ;
   Global $debug_SQL ;
   $millesime = millesime (0) ;
   
   Switch ($mode)
    {
     Case 1 : // Authentification interne
              // Est-ce un membre du personnel (enseignant/administratif) ?
              $resultat = SQL_commande ("SELECT droits,millesime FROM utilisateurs WHERE login='".$identifiant."' AND passe='".$mot_passe."'", $id_sql) ;
	      $nbr = SQL_nbr_lignes ($resultat) ;
              If ($nbr > 0)
               {
	        For ($i = 0 ; $i < $nbr ; $i++)
		 {
                  $ligne = SQL_ligne_suivante ($resultat) ;
                  If ($ligne [1] != $millesime)
		   {
		    If (($ligne [0] == $droit_supervision) Or ($ligne [0] == $droit_admin) Or ($ligne [0] == $droit_direction) Or
		        ($ligne [0] == $droit_secretariat)) { Return $ligne [0] ; }
		   }
                  ElseIf (($ligne [1] == $millesime) And ($ligne [0] > 0)) { Return $ligne [0] ; }
		 }
               }
              // Est-ce un eleve ?
              $resultat = SQL_commande ("SELECT id_eleve FROM eleves WHERE login='".$identifiant."' AND passe='".$mot_passe."' AND millesime='".$millesime."' AND exterieur>='0'", $id_sql) ;
              If (SQL_nbr_lignes ($resultat) > 0)
               {
	        If (SQL_nbr_lignes ($resultat) == 1)
                 {
                  $ligne = SQL_ligne_suivante ($resultat) ;
                  If ($ligne [0] > 0) { Return $droit_eleve ; }
	         }
	       }
	      // Est-ce un acces au cahier de texte ?
	      // Acces unique ?
	      $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice LIKE 'IDU_%' AND valeur='".$identifiant."' LIMIT 1", $id_sql) ;
	      If (SQL_nbr_lignes ($resultat) == 1)
               {
                $ligne1 = SQL_ligne_suivante ($resultat) ;
	        $l1 = Explode ("_", $ligne1 [0]) ;
	        $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice='MDPU_".$l1 [1]."' AND valeur='".$mot_passe."' LIMIT 1", $id_sql) ;
	        If (SQL_nbr_lignes ($resultat) == 1)
                 {
                  $ligne2 = SQL_ligne_suivante ($resultat) ;
	          // Verification si etablissement existe et a son cahier de texte active
	          $resultat = SQL_commande ("SELECT id_etablissement FROM etablissements WHERE cahier_textes='1' AND cahier_public='2' AND id_etablissement='".$l1 [1]."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
	          If (SQL_nbr_lignes ($resultat) == 1)
		   {
		    $ligne3 = SQL_ligne_suivante ($resultat) ;
		    $cahier_textes_id = -$ligne3 [0] ;
		    Return $droit_cahier_textes ;
		   }
	         }
               }
	      // Acces par classe ?
	      $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice LIKE 'IDC_%' AND valeur='".$identifiant."' LIMIT 1", $id_sql) ;
	      If (SQL_nbr_lignes ($resultat) == 1)
               {
                $ligne1 = SQL_ligne_suivante ($resultat) ;
	        $l1 = Explode ("_", $ligne1 [0]) ;
	        $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice='MDPC_".$l1 [1]."' AND valeur='".$mot_passe."' LIMIT 1", $id_sql) ;
	        If (SQL_nbr_lignes ($resultat) == 1)
                 {
                  $ligne2 = SQL_ligne_suivante ($resultat) ;
	          // Verification si etablissement existe et a son cahier de texte active
	          $resultat = SQL_commande ("SELECT e.id_etablissement,c.id_classe FROM etablissements e,classes c WHERE e.cahier_textes='1' AND e.cahier_public='3' AND c.etablissement=e.id_etablissement AND c.id_classe='".$l1 [1]."' AND c.millesime='".$millesime."' LIMIT 1", $id_sql) ;
	          If (SQL_nbr_lignes ($resultat) == 1)
		   {
		    $ligne3 = SQL_ligne_suivante ($resultat) ;
		    $cahier_textes_id = $ligne3 [1] ;
		    Return Array ($droit_cahier_textes, $l1 [1]) ;
		   }
	         }
               }
	      // Ben...sinon aucun droit !
	      Return $aucun_droit ;
	      Break ;
     Case 2 : // Authentification MySQL
              Break ;
     Case 3 : // Authentification LDAP
              $adresse_ip_ldap = "10.0.0.3" ;
	      $racine_ldap = "dc=labo,dc=jfc" ;
	      $admin_ldap = "cn=admin" ;
	      $passe_ldap = "admin" ;
	      $attribut_identifiant = "uid" ;
	      $attribut_mot_de_passe = "userpassword"; 
	      $position_arbre = "" ;
	      
	      // Met en place l'emplacement de recherche LDAP
	      $emplacement = $position_arbre ;
	      If ($position_arbre != "") { $emplacement .= "," ; }
	      $emplacement .= $position_arbre ;
              $id_ldap = ldap_connect ($adresse_ip_ldap) ; // Adresse du serveur LDAP
              If ($id_ldap)
               {
                // identification
                //$admin_ldap = "cn=admin,dc=branly" ;
                //$pass_ldap = "leon86v" ;
                If (ldap_bind ($id_ldap, $admin_ldap.",".$racine_ldap, $passe_ldap))
                 {
                  //$dn = "uid=".$ident.",ou=People,dc=branly" ;
		  //$dn = $attribut_identifiant."=".$identifiant.",".$emplacement ;
                  //$attr = "userpassword"; 
	          //$sr = ldap_search ($id_ldap, "ou=People,dc=branly", "uid=".$ident) ;
		  $sr = ldap_search ($id_ldap, $emplacement, $attribut_identifiant."=".$identifiant) ;
	          $info = ldap_get_entries ($id_ldap, $sr) ;
	          If ($info ["count"] == 1)
	           {
	            $ldap_pw = $info [0][$attribut_mot_de_passe][0] ;
	            $salt = SubStr ($ldap_pw, StrPos ($ldap_pw, "}")+1, 2) ;
	            $value = "{crypt}".crypt ($mot_passe, $salt) ;
	            If ($ldap_pw == $value) { echo "MDP correct" ; } Else { Return $aucun_droit ; }
	           }
		  else { echo "NON trouve" ; }
                 }
		Else
		 {
                  echo "Authentification impossible sur le serveur LDAP.";
                 }
                $ok = ldap_close ($id_ldap) ;
               }
	      Else
	       {
                echo "Impossible de se connecter au serveur LDAP.";
               }
              Break ;
     Case 4 : // Authentification CAS EnvOLE
              // Est-ce un membre du personnel (enseignant/administratif) ?
              $resultat = SQL_commande ("SELECT droits,millesime,passe FROM utilisateurs WHERE login='".$identifiant."'", $id_sql) ;
              $nbr = SQL_nbr_lignes ($resultat) ;
              If ($nbr > 0)
               {
                For ($i = 0 ; $i < $nbr ; $i++)
                 {
                  $ligne = SQL_ligne_suivante ($resultat) ;
                  If ($ligne [1] != $millesime)
                   {
                    If (($ligne [0] == $droit_supervision) Or ($ligne [0] == $droit_admin) Or ($ligne [0] == $droit_direction) Or ($ligne [0] == $droit_secretariat))
           	  { Return Array ($ligne [0],$ligne [2]) ; }
                   }
                  ElseIf (($ligne [1] == $millesime) And ($ligne [0] > 0)) { Return Array ($ligne [0],$ligne [2]) ; }
                 }
               }
              // Est-ce un eleve ?
              $resultat = SQL_commande ("SELECT id_eleve,passe FROM eleves WHERE login='".$identifiant."' AND millesime='".$millesime."' AND exterieur>='0'", $id_sql) ;
              If (SQL_nbr_lignes ($resultat) > 0)
               {
                If (SQL_nbr_lignes ($resultat) == 1)
                 {
                  $ligne = SQL_ligne_suivante ($resultat) ;
                  If ($ligne [0] > 0) { Return Array ($droit_eleve,$ligne [1]) ; }
                 }
               }
              // Est-ce un acces au cahier de texte ?
              // Acces unique ?
              $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice LIKE 'IDU_%' AND valeur='".$identifiant."' LIMIT 1", $id_sql) ;
              If (SQL_nbr_lignes ($resultat) == 1)
               {
                $ligne1 = SQL_ligne_suivante ($resultat) ;
                $l1 = Explode ("_", $ligne1 [0]) ;
                // Retrouve le MDP
                $resultat = SQL_commande ("SELECT valeur FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice='MDPU_".$l1 [1]."' LIMIT 1", $id_sql) ;
                $ligne2 = SQL_ligne_suivante ($resultat) ;
                // Verification si etablissement existe et a son cahier de texte active
                $resultat = SQL_commande ("SELECT id_etablissement FROM etablissements WHERE cahier_textes='1' AND cahier_public='2' AND id_etablissement='".$l1 [1]."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
                If (SQL_nbr_lignes ($resultat) == 1)
                 {
                  $ligne3 = SQL_ligne_suivante ($resultat) ;
                  $cahier_textes_id = -$ligne3 [0] ;
                  Return Array ($droit_cahier_textes,$ligne2 [0]) ;
                 }
               }
             // Acces par classe ?
             $resultat = SQL_commande ("SELECT indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice LIKE 'IDC_%' AND valeur='".$identifiant."' LIMIT 1", $id_sql) ;
             If (SQL_nbr_lignes ($resultat) == 1)
              {
               $ligne1 = SQL_ligne_suivante ($resultat) ;
               $l1 = Explode ("_", $ligne1 [0]) ;
               // Retrouve le MDP
               $resultat = SQL_commande ("SELECT valeur,indice FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='CAHIER_TEXTES' AND indice='MDPC_".$l1 [1]."' LIMIT 1", $id_sql) ;
               $ligne2 = SQL_ligne_suivante ($resultat) ;
               // Verification si etablissement existe et a son cahier de texte active
               $resultat = SQL_commande ("SELECT e.id_etablissement,c.id_classe FROM etablissements e,classes c WHERE e.cahier_textes='1' AND e.cahier_public='3' AND c.etablissement=e.id_etablissement AND c.id_classe='".$l1 [1]."' AND c.millesime='".$millesime."' LIMIT 1", $id_sql) ;
               If (SQL_nbr_lignes ($resultat) == 1)
                {
                 $ligne3 = SQL_ligne_suivante ($resultat) ;
                 $cahier_textes_id = $ligne3 [1] ;
                 Return Array ($droit_cahier_textes,$ligne2 [0]) ;
                }
              }
	     // Ben...sinon aucun droit !
             Return $aucun_droit ;
             Break ;
    }
   // Ben...sinon aucun droit !
   Return $aucun_droit ;
  }
 /**
 * Determine les droits utilisateur
 * @param string $ident Identifiant
 * @param string $passe Mot de passe
 * @return string Droit de l'utilisateur
 */
 Function droits ($ident, $passe)
  {
   Global $auth_mode,$id_sql,$aucun_droit,$droit_eleve,$droit_secretariat,$droit_direction,$droit_admin ;
   Global $droit_supervision,$multi_etablissement,$multi_bases ;
   Global $sql_adresse_supervision,$sql_secondaire_supervision,$sql_tertiaire_supervision,$sql_qui_supervision ;
   Global $sql_passe_supervision,$sql_base_supervision,$sql_entete_supervision,$sql_port_supervision,$timeout ;
   //Global $debug_SQL ;
   
   //$debug_SQL=1;
   $ident = Str_Replace (" ", "", $ident) ;
   $ident = Str_Replace ("%20", "", $ident) ;
   $ident = AddSlashes ($ident) ;
   $passe = Str_Replace (" ", "", $passe) ;
   $passe = Str_Replace ("%20", "", $passe) ;
   $passe = AddSlashes ($passe) ;
   If ((($ident == '') Or ($passe == '')) And ($auth_mode != 4)) { Return $aucun_droit ; }
   /*
   If ($multi_etablissement == 1)
    {
     $debug_SQL=1;
     $id_sql_supervision = connexion_supervision ($sql_adresse_supervision,$sql_secondaire_supervision,$sql_tertiaire_supervision,$sql_qui_supervision,
                                                  $sql_passe_supervision,$sql_base_supervision,$sql_entete_supervision,$sql_port_supervision,$timeout) ;
     If (IsSet ($id_sql_supervision))
      {
       $resultat = SQL_commande ("SELECT droits FROM utilisateurs WHERE login='".$ident."' AND passe='".$passe."'", $id_sql_supervision) ;
       If (SQL_nbr_lignes ($resultat) > 0)
        {
         $ligne = SQL_ligne_suivante ($resultat) ;
         If ($ligne [0] == $droit_supervision) { Return $ligne [0] ; }
        }
      }
    }
   */
   Switch ($auth_mode)
    {
     Case 1 : // Interne
              $droit_retour = authentification (1, $ident, $passe) ;
	      Break ;
     Case 2 : // MySQL
              $droit_retour = authentification (2, $ident, $passe) ;
              If ($droit_retour != $aucun_droit) { Return $droit_retour ; }
	      $droit_retour = authentification (1, $ident, $passe) ;
	      Break ;
     Case 3 : // LDAP
              $droit_retour = authentification (3, $ident, $passe) ;
              If ($droit_retour != $aucun_droit) { Return $droit_retour ; }
	      $droit_retour = authentification (1, $ident, $passe) ;
	      Break ;
     Case 4 : // Authentification CAS EnvOLE
              $droit_retour = authentification (4, $ident, "") ;
              Break ;
    }
   Return $droit_retour ;
  }

 // ===============================================================================
 //  GESTION DES CHAINES DE CARACTERES
 // -------------------------------------------------------------------------------
 /**
 * Fonction de filtrage des variables venant d'un formulaire a destination du SQL
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function filtrage ($nom)
  {
   $nom = StripSlashes (Trim ($nom)) ;
   //$nom = AddSlashes (StrTr ($nom, Chr (145).Chr (146).Chr (147).Chr (148).Chr (150).Chr (151).Chr (180), "''\"\"--'")) ;
   $nom = Str_Replace ("'", "\\'", $nom) ;
   $nom = Str_Replace (Chr (133), "...", $nom) ;
   Return $nom ;
  }

 /**
 * Fonction de filtrage des accents : elimine
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function filtrage_accents ($nom)
  {
   $car1 = "����������������������������������" ;
   $car2 = "CueaaaaceeeiiiAAE��ooouuEEEEAAAUUU" ;
   For ($i = 0 ; $i < StrLen ($car1) ; $i++)
    {
     $nom = Str_Replace ($car1 [$i], $car2 [$i], $nom) ;
    }
   Return $nom ;
  }
 
 /**
 * Fonction de filtrage des accents : passe en majuscule
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function filtrage_accents_maj ($nom)
  {
   $car1 = "������������������������������" ;
   $car2 = "�����������������������������Y" ;
   For ($i = 0 ; $i < StrLen ($car1) ; $i++)
    {
     $nom = Str_Replace ($car1 [$i], $car2 [$i], $nom) ;
    }
   Return $nom ;
  }
 
 /**
 * Fonction de traduction des caracteres UTF8
 * @param string $texte Variable a filtrer
 * @return string Variable filtree
 */
 Function filtrage_utf8 ($texte)
  {
   //$texte = utf8_decode ($texte) ;
   //$texte = iconv ("UTF-8","ISO-8859-1//TRANSLIT",$texte) ;
   $table_utf8 = "����������������������������������������������������������������" ;
   $double_utf8 [0][0] = 129 ;
   $double_utf8 [1][0] = Chr (192) ;
   $double_utf8 [1][1] = Chr (195).Chr (128) ;
   $double_utf8 [2][0] = Chr (193) ;
   $double_utf8 [2][1] = Chr (195).Chr (129) ;
   $double_utf8 [3][0] = Chr (194) ;
   $double_utf8 [3][1] = Chr (195).Chr (130) ;
   $double_utf8 [4][0] = Chr (195) ;
   $double_utf8 [4][1] = Chr (195).Chr (131) ;
   $double_utf8 [5][0] = Chr (196) ;
   $double_utf8 [5][1] = Chr (195).Chr (132) ;
   $double_utf8 [6][0] = Chr (197) ;
   $double_utf8 [6][1] = Chr (195).Chr (133) ;
   $double_utf8 [7][0] = Chr (198) ;
   $double_utf8 [7][1] = Chr (195).Chr (134) ;
   $double_utf8 [8][0] = Chr (199) ;
   $double_utf8 [8][1] = Chr (195).Chr (135) ;
   $double_utf8 [9][0] = Chr (200) ;
   $double_utf8 [9][1] = Chr (195).Chr (136) ;
   $double_utf8 [10][0] = Chr (201) ;
   $double_utf8 [10][1] = Chr (195).Chr (137) ;
   $double_utf8 [11][0] = Chr (202) ;
   $double_utf8 [11][1] = Chr (195).Chr (138) ;
   $double_utf8 [12][0] = Chr (203) ;
   $double_utf8 [12][1] = Chr (195).Chr (139) ;
   $double_utf8 [13][0] = Chr (204) ;
   $double_utf8 [13][1] = Chr (195).Chr (140) ;
   $double_utf8 [14][0] = Chr (205) ;
   $double_utf8 [14][1] = Chr (195).Chr (141) ;
   $double_utf8 [15][0] = Chr (206) ;
   $double_utf8 [15][1] = Chr (195).Chr (142) ;
   $double_utf8 [16][0] = Chr (207) ;
   $double_utf8 [16][1] = Chr (195).Chr (143) ;
   $double_utf8 [17][0] = Chr (208) ;
   $double_utf8 [17][1] = Chr (195).Chr (144) ;
   $double_utf8 [18][0] = Chr (209) ;
   $double_utf8 [18][1] = Chr (195).Chr (145) ;
   $double_utf8 [19][0] = Chr (210) ;
   $double_utf8 [19][1] = Chr (195).Chr (146) ;
   $double_utf8 [20][0] = Chr (211) ;
   $double_utf8 [20][1] = Chr (195).Chr (147) ;
   $double_utf8 [21][0] = Chr (212) ;
   $double_utf8 [21][1] = Chr (195).Chr (148) ;
   $double_utf8 [22][0] = Chr (213) ;
   $double_utf8 [22][1] = Chr (195).Chr (149) ;
   $double_utf8 [23][0] = Chr (214) ;
   $double_utf8 [23][1] = Chr (195).Chr (150) ;
   $double_utf8 [24][0] = Chr (215) ;
   $double_utf8 [24][1] = Chr (195).Chr (151) ;
   $double_utf8 [25][0] = Chr (216) ;
   $double_utf8 [25][1] = Chr (195).Chr (152) ;
   $double_utf8 [26][0] = Chr (217) ;
   $double_utf8 [26][1] = Chr (195).Chr (153) ;
   $double_utf8 [27][0] = Chr (218) ;
   $double_utf8 [27][1] = Chr (195).Chr (154) ;
   $double_utf8 [28][0] = Chr (219) ;
   $double_utf8 [28][1] = Chr (195).Chr (155) ;
   $double_utf8 [29][0] = Chr (220) ;
   $double_utf8 [29][1] = Chr (195).Chr (156) ;
   $double_utf8 [30][0] = Chr (221) ;
   $double_utf8 [30][1] = Chr (195).Chr (157) ;
   $double_utf8 [31][0] = Chr (222) ;
   $double_utf8 [31][1] = Chr (195).Chr (158) ;
   $double_utf8 [32][0] = Chr (223) ;
   $double_utf8 [32][1] = Chr (195).Chr (159) ;
   $double_utf8 [33][0] = Chr (224) ;
   $double_utf8 [33][1] = Chr (195).Chr (160) ;
   $double_utf8 [34][0] = Chr (225) ;
   $double_utf8 [34][1] = Chr (195).Chr (161) ;
   $double_utf8 [35][0] = Chr (226) ;
   $double_utf8 [35][1] = Chr (195).Chr (162) ;
   $double_utf8 [36][0] = Chr (227) ;
   $double_utf8 [36][1] = Chr (195).Chr (163) ;
   $double_utf8 [37][0] = Chr (228) ;
   $double_utf8 [37][1] = Chr (195).Chr (164) ;
   $double_utf8 [38][0] = Chr (229) ;
   $double_utf8 [38][1] = Chr (195).Chr (165) ;
   $double_utf8 [39][0] = Chr (230) ;
   $double_utf8 [39][1] = Chr (195).Chr (166) ;
   $double_utf8 [40][0] = Chr (231) ;
   $double_utf8 [40][1] = Chr (195).Chr (167) ;
   $double_utf8 [41][0] = Chr (232) ;
   $double_utf8 [41][1] = Chr (195).Chr (168) ;
   $double_utf8 [42][0] = Chr (233) ;
   $double_utf8 [42][1] = Chr (195).Chr (169) ;
   $double_utf8 [43][0] = Chr (234) ;
   $double_utf8 [43][1] = Chr (195).Chr (170) ;
   $double_utf8 [44][0] = Chr (235) ;
   $double_utf8 [44][1] = Chr (195).Chr (171) ;
   $double_utf8 [45][0] = Chr (236) ;
   $double_utf8 [45][1] = Chr (195).Chr (172) ;
   $double_utf8 [46][0] = Chr (237) ;
   $double_utf8 [46][1] = Chr (195).Chr (173) ;
   $double_utf8 [47][0] = Chr (238) ;
   $double_utf8 [47][1] = Chr (195).Chr (174) ;
   $double_utf8 [48][0] = Chr (239) ;
   $double_utf8 [48][1] = Chr (195).Chr (175) ;
   $double_utf8 [49][0] = Chr (240) ;
   $double_utf8 [49][1] = Chr (195).Chr (176) ;
   $double_utf8 [50][0] = Chr (241) ;
   $double_utf8 [50][1] = Chr (195).Chr (177) ;
   $double_utf8 [51][0] = Chr (242) ;
   $double_utf8 [51][1] = Chr (195).Chr (178) ;
   $double_utf8 [52][0] = Chr (243) ;
   $double_utf8 [52][1] = Chr (195).Chr (179) ;
   $double_utf8 [53][0] = Chr (244) ;
   $double_utf8 [53][1] = Chr (195).Chr (180) ;
   $double_utf8 [54][0] = Chr (245) ;
   $double_utf8 [54][1] = Chr (195).Chr (181) ;
   $double_utf8 [55][0] = Chr (246) ;
   $double_utf8 [55][1] = Chr (195).Chr (182) ;
   $double_utf8 [56][0] = Chr (247) ;
   $double_utf8 [56][1] = Chr (195).Chr (183) ;
   $double_utf8 [57][0] = Chr (248) ;
   $double_utf8 [57][1] = Chr (195).Chr (184) ;
   $double_utf8 [58][0] = Chr (249) ;
   $double_utf8 [58][1] = Chr (195).Chr (185) ;
   $double_utf8 [59][0] = Chr (250) ;
   $double_utf8 [59][1] = Chr (195).Chr (186) ;
   $double_utf8 [60][0] = Chr (251) ;
   $double_utf8 [60][1] = Chr (195).Chr (187) ;
   $double_utf8 [61][0] = Chr (252) ;
   $double_utf8 [61][1] = Chr (195).Chr (188) ;
   $double_utf8 [62][0] = Chr (253) ;
   $double_utf8 [62][1] = Chr (195).Chr (189) ;
   $double_utf8 [63][0] = Chr (254) ;
   $double_utf8 [63][1] = Chr (195).Chr (190) ;
   $double_utf8 [64][0] = Chr (255) ;
   $double_utf8 [64][1] = Chr (195).Chr (191) ;
   $double_utf8 [65][0] = Chr (128) ;
   $double_utf8 [65][1] = Chr (194).Chr (128) ;
   $double_utf8 [66][0] = Chr (129) ;
   $double_utf8 [66][1] = Chr (194).Chr (129) ;
   $double_utf8 [67][0] = Chr (130) ;
   $double_utf8 [67][1] = Chr (194).Chr (130) ;
   $double_utf8 [68][0] = Chr (131) ;
   $double_utf8 [68][1] = Chr (194).Chr (131) ;
   $double_utf8 [69][0] = Chr (132) ;
   $double_utf8 [69][1] = Chr (194).Chr (132) ;
   $double_utf8 [70][0] = Chr (133) ;
   $double_utf8 [70][1] = Chr (194).Chr (133) ;
   $double_utf8 [71][0] = Chr (134) ;
   $double_utf8 [71][1] = Chr (194).Chr (134) ;
   $double_utf8 [72][0] = Chr (135) ;
   $double_utf8 [72][1] = Chr (194).Chr (135) ;
   $double_utf8 [73][0] = Chr (136) ;
   $double_utf8 [73][1] = Chr (194).Chr (136) ;
   $double_utf8 [74][0] = Chr (137) ;
   $double_utf8 [74][1] = Chr (194).Chr (137) ;
   $double_utf8 [75][0] = Chr (138) ;
   $double_utf8 [75][1] = Chr (194).Chr (138) ;
   $double_utf8 [76][0] = Chr (139) ;
   $double_utf8 [76][1] = Chr (194).Chr (139) ;
   $double_utf8 [77][0] = Chr (140) ;
   $double_utf8 [77][1] = Chr (194).Chr (140) ;
   $double_utf8 [78][0] = Chr (141) ;
   $double_utf8 [78][1] = Chr (194).Chr (141) ;
   $double_utf8 [79][0] = Chr (142) ;
   $double_utf8 [79][1] = Chr (194).Chr (142) ;
   $double_utf8 [80][0] = Chr (143) ;
   $double_utf8 [80][1] = Chr (194).Chr (143) ;
   $double_utf8 [81][0] = Chr (144) ;
   $double_utf8 [81][1] = Chr (194).Chr (144) ;
   $double_utf8 [82][0] = Chr (145) ;
   $double_utf8 [82][1] = Chr (194).Chr (145) ;
   $double_utf8 [83][0] = Chr (146) ;
   $double_utf8 [83][1] = Chr (194).Chr (146) ;
   $double_utf8 [84][0] = Chr (147) ;
   $double_utf8 [84][1] = Chr (194).Chr (147) ;
   $double_utf8 [85][0] = Chr (148) ;
   $double_utf8 [85][1] = Chr (194).Chr (148) ;
   $double_utf8 [86][0] = Chr (149) ;
   $double_utf8 [86][1] = Chr (194).Chr (149) ;
   $double_utf8 [87][0] = Chr (150) ;
   $double_utf8 [87][1] = Chr (194).Chr (150) ;
   $double_utf8 [88][0] = Chr (151) ;
   $double_utf8 [88][1] = Chr (194).Chr (151) ;
   $double_utf8 [89][0] = Chr (152) ;
   $double_utf8 [89][1] = Chr (194).Chr (152) ;
   $double_utf8 [90][0] = Chr (153) ;
   $double_utf8 [90][1] = Chr (194).Chr (153) ;
   $double_utf8 [91][0] = Chr (154) ;
   $double_utf8 [91][1] = Chr (194).Chr (154) ;
   $double_utf8 [92][0] = Chr (155) ;
   $double_utf8 [92][1] = Chr (194).Chr (155) ;
   $double_utf8 [93][0] = Chr (156) ;
   $double_utf8 [93][1] = Chr (194).Chr (156) ;
   $double_utf8 [94][0] = Chr (157) ;
   $double_utf8 [94][1] = Chr (194).Chr (157) ;
   $double_utf8 [95][0] = Chr (158) ;
   $double_utf8 [95][1] = Chr (194).Chr (158) ;
   $double_utf8 [96][0] = Chr (159) ;
   $double_utf8 [96][1] = Chr (194).Chr (159) ;
   $double_utf8 [97][0] = Chr (160) ;
   $double_utf8 [97][1] = Chr (194).Chr (160) ;
   $double_utf8 [98][0] = Chr (161) ;
   $double_utf8 [98][1] = Chr (194).Chr (161) ;
   $double_utf8 [99][0] = Chr (162) ;
   $double_utf8 [99][1] = Chr (194).Chr (162) ;
   $double_utf8 [100][0] = Chr (163) ;
   $double_utf8 [100][1] = Chr (194).Chr (163) ;
   $double_utf8 [101][0] = Chr (164) ;
   $double_utf8 [101][1] = Chr (226).Chr (130).Chr (172) ;
   $double_utf8 [102][0] = Chr (165) ;
   $double_utf8 [102][1] = Chr (194).Chr (165) ;
   $double_utf8 [103][0] = Chr (166) ;
   $double_utf8 [103][1] = Chr (197).Chr (160) ;
   $double_utf8 [104][0] = Chr (167) ;
   $double_utf8 [104][1] = Chr (194).Chr (167) ;
   $double_utf8 [105][0] = Chr (168) ;
   $double_utf8 [105][1] = Chr (197).Chr (161) ;
   $double_utf8 [106][0] = Chr (169) ;
   $double_utf8 [106][1] = Chr (194).Chr (169) ;
   $double_utf8 [107][0] = Chr (170) ;
   $double_utf8 [107][1] = Chr (194).Chr (170) ;
   $double_utf8 [108][0] = Chr (171) ;
   $double_utf8 [108][1] = Chr (194).Chr (171) ;
   $double_utf8 [109][0] = Chr (172) ;
   $double_utf8 [109][1] = Chr (194).Chr (172) ;
   $double_utf8 [110][0] = Chr (173) ;
   $double_utf8 [110][1] = Chr (194).Chr (173) ;
   $double_utf8 [111][0] = Chr (174) ;
   $double_utf8 [111][1] = Chr (194).Chr (174) ;
   $double_utf8 [112][0] = Chr (175) ;
   $double_utf8 [112][1] = Chr (194).Chr (175) ;
   $double_utf8 [113][0] = Chr (176) ;
   $double_utf8 [113][1] = Chr (194).Chr (176) ;
   $double_utf8 [114][0] = Chr (177) ;
   $double_utf8 [114][1] = Chr (194).Chr (177) ;
   $double_utf8 [115][0] = Chr (178) ;
   $double_utf8 [115][1] = Chr (194).Chr (178) ;
   $double_utf8 [116][0] = Chr (179) ;
   $double_utf8 [116][1] = Chr (194).Chr (179) ;
   $double_utf8 [117][0] = Chr (180) ;
   $double_utf8 [117][1] = Chr (197).Chr (189) ;
   $double_utf8 [118][0] = Chr (181) ;
   $double_utf8 [118][1] = Chr (194).Chr (181) ;
   $double_utf8 [119][0] = Chr (182) ;
   $double_utf8 [119][1] = Chr (194).Chr (182) ;
   $double_utf8 [120][0] = Chr (183) ;
   $double_utf8 [120][1] = Chr (194).Chr (183) ;
   $double_utf8 [121][0] = Chr (184) ;
   $double_utf8 [121][1] = Chr (197).Chr (190) ;
   $double_utf8 [122][0] = Chr (185) ;
   $double_utf8 [122][1] = Chr (194).Chr (185) ;
   $double_utf8 [123][0] = Chr (186) ;
   $double_utf8 [123][1] = Chr (194).Chr (186) ;
   $double_utf8 [124][0] = Chr (187) ;
   $double_utf8 [124][1] = Chr (194).Chr (187) ;
   $double_utf8 [125][0] = Chr (188) ;
   $double_utf8 [125][1] = Chr (197).Chr (146) ;
   $double_utf8 [126][0] = Chr (189) ;
   $double_utf8 [126][1] = Chr (197).Chr (147) ;
   $double_utf8 [127][0] = Chr (190) ;
   $double_utf8 [127][1] = Chr (197).Chr (184) ;
   $double_utf8 [128][0] = Chr (191) ;
   $double_utf8 [128][1] = Chr (194).Chr (191) ;
   $double_utf8 [129][0] = Chr (168) ;
   $double_utf8 [129][1] = Chr (194).Chr (168) ;
   // Cas particuliers
   /*
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (168), Chr (232), $texte) ; // e grave
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (174), Chr (238), $texte) ; // i trema
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (160), Chr (224), $texte) ; // a grave
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63), Chr (200), $texte) ; // E grave
   $texte = Str_Replace (Chr (195).Chr (0).Chr (63).Chr (195).Chr (0).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (174), Chr (238), $texte) ; // i trema
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (168), Chr (232), $texte) ; // e grave
   $texte = Str_Replace (Chr (239).Chr (191).Chr (189).Chr (63), Chr (200), $texte) ; // E grave
   $texte = Str_Replace (Chr (195).Chr (131).Chr (194).Chr (180), Chr (244), $texte) ; // o circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63), Chr (244), $texte) ; // o circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (39), Chr (244), $texte) ; // o circ
   $texte = Str_Replace (Chr (239).Chr (191).Chr (189), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (39), Chr (244), $texte) ; // o circ
   */
   $texte = Str_Replace (Chr (195).Chr (131).Chr (194).Chr (175).Chr (195).Chr (130).Chr (194).Chr (191).Chr (195).Chr (130).Chr (194).Chr (189).Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (168), Chr (232), $texte) ; // e grave
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (174), Chr (238), $texte) ; // i trema
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63).Chr (195).Chr (130).Chr (194).Chr (160), Chr (224), $texte) ; // a grave
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189).Chr (63), Chr (200), $texte) ; // E grave
   $texte = Str_Replace (Chr (195).Chr (0).Chr (63).Chr (195).Chr (0).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (160), Chr (224), $texte) ; // a grave
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (162), Chr (226), $texte) ; // a circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (167), Chr (231), $texte) ; // c cedil
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (168), Chr (232), $texte) ; // e grave
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (170), Chr (234), $texte) ; // e circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (195).Chr (130).Chr (194).Chr (174), Chr (238), $texte) ; // i trema
   $texte = Str_Replace (Chr (195).Chr (175).Chr (194).Chr (191).Chr (194).Chr (189), Chr (233), $texte) ; // e aigu
   //$texte = Str_Replace (Chr (239).Chr (191).Chr (189).Chr (63), Chr (200), $texte) ; // E grave
   $texte = Str_Replace (Chr (195).Chr (131).Chr (194).Chr (180), Chr (244), $texte) ; // o circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (63).Chr (39), Chr (244), $texte) ; // o circ
   $texte = Str_Replace (Chr (195).Chr (131).Chr (39), Chr (244), $texte) ; // o circ
   //$texte = Str_Replace (Chr (239).Chr (191).Chr (189), "&", $texte) ; // e aigu
   //$texte = Str_Replace (Chr (195).Chr (39), Chr (244), $texte) ; // o circ
   
   For ($i = 1 ; $i <= $double_utf8 [0][0] ; $i++)
    {
     $texte = Str_Replace ($double_utf8 [$i][1], $double_utf8 [$i][0], $texte) ;
    }
   For ($i = 1 ; $i <= $double_utf8 [0][0] ; $i++)
    {
     $texte = Str_Replace ($double_utf8 [$i][1], $double_utf8 [$i][0], $texte) ;
    }
   For ($i = 0 ; $i < 64 ; $i++)
    {
     $texte = Str_Replace (Chr (195).Chr (128+$i), $table_utf8 [$i], $texte) ;
    }
   $texte = Str_Replace (Chr (195).Chr (63).Chr (160), Chr (224), $texte) ; // a grave
   $texte = Str_Replace (Chr (195).Chr (63).Chr (169), Chr (233), $texte) ; // e aigu
   $texte = Str_Replace (Chr (195).Chr (63).Chr (168), Chr (232), $texte) ; // e grave
   $texte = Str_Replace (Chr (195).Chr (63).Chr (174), Chr (238), $texte) ; // i trema
   Return $texte ;
  }
 
 /**
 * Fonction de filtrage de texte venant de fckeditor
 * @param string $texte Texte a filtrer
 * @return string Texte filtre
 */
 Function filtrage_fckeditor ($texte)
  {
   // Recherche des meta
   $pos1 = StrPos ($texte, "<meta") ;
   While ($pos1)
    {
     $pos2 = StrPos ($texte, ">", $pos1+1) ;
     $texte = SubStr ($texte, $pos2+1, StrLen ($texte)-$pos2-1) ;
     $pos1 = StrPos ($texte, "<meta") ;
     //echo $texte."<hr>" ;
    }
   $texte = Str_Replace ("</meta>", "", $texte) ;
   // Recherche des styles
   $pos1 = StrPos ($texte, "<style type=") ;
   While ($pos1)
    {
     $pos2 = StrPos ($texte, "</style>", $pos1+1) ;
     $texte = SubStr ($texte, $pos2+8, StrLen ($texte)-$pos2-8) ;
     $pos1 = StrPos ($texte, "<style type=") ;
    }
   $texte = Str_Replace ("</style>", "", $texte) ;
   Return $texte ;
  }
 
 /**
 * Fonction de conversion des codes html vers codes ascii (pour pdf)
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_html_ascii ($nom)
  {
   $car1  = "&Ccedil;&uuml;&eacute;&agrave;&auml;&agrave;&aring;&ccedil;&ecirc;&euml;&egrave;&iuml;&icirc;&igrave;" ;
   $car1 .= "&Auml;&Aring;&Eacute;&aelig;&AElig;&ocirc;&ouml;&ograve;&ucirc;&ugrave;&Eacute;&Egrave;&Ecirc;&Euml;" ;
   $car1 .= "&Agrave;&Acirc;&Auml;&Ugrave;&Ucirc;&Uuml;&amp;" ;
   $car2  = "����������������������������������&" ;
   $c = Explode (";", $car1) ;
   For ($i = 0 ; $i < StrLen ($c) ; $i++)
    {
     $nom = Str_Replace ($c [$i].";", $car2 [$i], $nom) ;
    }
   Return $nom ;
  }

 /**
 * Fonction de conversion des codes ascii vers html (pour affichage)
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_ascii_html ($nom)
  {
   $car1  = "����������������������������������&" ;
   $car2  = "&Ccedil;&uuml;&eacute;&agrave;&auml;&agrave;&aring;&ccedil;&ecirc;&euml;&egrave;&iuml;&icirc;&igrave;" ;
   $car2 .= "&Auml;&Aring;&Eacute;&aelig;&AElig;&ocirc;&ouml;&ograve;&ucirc;&ugrave;&Eacute;&Egrave;&Ecirc;&Euml;" ;
   $car2 .= "&Agrave;&Acirc;&Auml;&Ugrave;&Ucirc;&Uuml;&amp;" ;
   $c = Explode (";", $car2) ;
   For ($i = 0 ; $i < StrLen ($c) ; $i++)
    {
     $nom = Str_Replace ($car1 [$i], $c [$i].";", $nom) ;
    }
   Return $nom ;
  } 

 /**
 * Fonction de conversion UTF8 vers codes ASCII (pour pdf)
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_utf8_ascii ($nom)
  {
   For ($i = 0 ; $i < 64 ; $i++)
    {
     $nom = Str_Replace (Chr (195).Chr (128+$i), Chr (192+$i), $nom) ;
    }
   Return $nom ;
  }
 
 /**
 * Fonction de conversion ASCII vers codes UTF8
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_ascii_utf8 ($nom)
  {
   For ($i = 0 ; $i < 64 ; $i++)
    {
     $nom = Str_Replace (Chr (192+$i), Chr (195).Chr (128+$i), $nom) ;
    }
   Return $nom ;
  }
 
 /**
 * Fonction de conversion UTF8 vers codes HTML (pour affichage)
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_utf8_html ($nom)
  {
   For ($i = 0 ; $i < 64 ; $i++)
    {
     $nom = Str_Replace (Chr (195).Chr (128+$i), "&#".(192+$i).";", $nom) ;
    }
   Return $nom ;
  }
 
 /**
 * Fonction de conversion des caracteres
 * @param string $nom Variable a filtrer
 * @return string Variable filtree
 */
 Function conversion_car ($chaine, $mode)
  {
   Global $caracteres_serveur_SQL, $caracteres_fichiers ;
   Switch ($mode)
    {
     Default :
     Case SQL_AFFICHAGE_HTML :
     Case SQL_EDITION_HTML : Switch ($caracteres_serveur_SQL)
                              {
			             Default :
			         Case "utf8" : $chaine = conversion_utf8_html ($chaine) ; Break ;
			       Case "latin1" : $chaine = conversion_ascii_html ($chaine) ; Break ;
			      }
			     $chaine = conversion_ascii_html ($chaine) ;
			     Break ;
     Case SQL_AFFICHAGE_PDF : Switch ($caracteres_serveur_SQL)
                               {
			            Default :
			        Case "utf8" : $chaine = conversion_utf8_ascii ($chaine) ; Break ;
			       }
			      Break ;
     Case FIC_AFFICHAGE_HTML :
     Case FIC_EDITION_HTML : Switch ($caracteres_fichiers)
                              {
			             Default :
			         Case "utf8" : $chaine = conversion_utf8_html ($chaine) ; Break ;
			       Case "latin1" : $chaine = conversion_ascii_html ($chaine) ; Break ;
			      }
			     $chaine = conversion_ascii_html ($chaine) ;
			     Break ;
     Case FIC_AFFICHAGE_PDF : Switch ($caracteres_fichiers)
                               {
			            Default :
			        Case "utf8" : $chaine = conversion_utf8_ascii ($chaine) ; Break ;
			       }
			      Break ;
    }
   Return $chaine ;
  }

 /**
 * Extraction du premier caractere en fonction de la table utilisee
 * @param string $chaine Chaine dont il faut extraire le premier caractere
 * @param string $jeu Nom du jeu de caracteres (utf8-latin1)
 * @return string Premier caractere si possible (par rapport aux jeux) sinon vide
 */
 Function premier_caractere ($chaine, $jeu)
  {
   $pc = "" ;
   If ($jeu == "latin1") { $pc = SubStr ($chaine, 0, 1) ; }
   ElseIf ($jeu == "utf8")
    {
     $chaine = conversion_utf8_ascii ($chaine) ;
     $sc = SubStr ($chaine, 0, 1) ;
     $pc = conversion_ascii_utf8 ($sc) ;
    }
   Return $pc ;
  }
 
 // ===============================================================================
 //  GESTION DES SAUVEGARDES/RESTAURATION CONFIGURATION
 // -------------------------------------------------------------------------------
 /**
 * Sauvegarde d'une variable personnelle dans la bdd, table configuration
 * @param string $identification Identifiant unique de la variable pour la retrouver
 * @param string $nom Nom de la variable
 * @param string $indice Indice ou nom supplementaire
 * @param string $valeur Valeur de la variable
 * @return int 1=MAJ, 2=Creation
 */
 Function sauvegarde_configuration ($identification, $nom, $indice, $valeur)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   $ok = 0 ;
   $res = SQL_commande ("SELECT id_configuration FROM configuration WHERE identification='".$identification."' AND nom='".$nom."' AND indice='".$indice."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     // Existe
     $conf = SQL_ligne_suivante ($res) ; 
     $res = SQL_commande ("UPDATE configuration SET valeur='".$valeur."' WHERE id_configuration='".$conf [0]."' LIMIT 1", $id_sql) ;
     $ok = 1 ;
    }
   Else
    {
     // N'existe pas -> insertion
     $res = SQL_commande ("INSERT INTO configuration (identification,nom,indice,valeur,millesime) VALUES ('".$identification."','".$nom."','".$indice."','".$valeur."','".$millesime."')", $id_sql) ;
     $ok = 2 ;
    }
   Return $ok ;
  }
 
 /**
 * Restauration de la valeur d'une variable dans la bdd, table configuration
 * @param string $identification Identifiant unique de la variable pour la retrouver
 * @param string $nom Nom de la variable
 * @param string $indice Indice ou nom supplementaire
 * @return string Valeur de la variable (si n'existe pas retourne une chaine vide)
 */
 Function restaure_configuration ($identification, $nom, $indice)
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT valeur FROM configuration WHERE identification='".$identification."' AND nom='".$nom."' AND indice='".$indice."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1) { $v = SQL_ligne_suivante ($res) ; } Else { $v [0] = "" ; }
   Return $v [0] ;
  }
 
 /**
 * Restauration de la valeur d'une variable dans la bdd, table configuration avec valeur par defaut
 * @param string $identification Identifiant unique de la variable pour la retrouver
 * @param string $nom Nom de la variable
 * @param string $indice Indice ou nom supplementaire
 * @param string $valeur_defaut Valeur de defaut le cas echeant
 * @return string Valeur de la variable (si n'existe pas retourne la valeur par defaut et creation de l'entree)
 */
 Function restaure_configuration_defaut ($identification, $nom, $indice, $valeur_defaut)
  {
   $valeur = restaure_configuration ($identification, $nom, $indice) ;
   If ($valeur == "") { sauvegarde_configuration ($identification, $nom, $indice, $valeur_defaut) ; $valeur = $valeur_defaut ; }
   Return $valeur ;
  }

 /**
 * Efface la variable dans la bdd, table configuration
 * @param string $identification Identifiant unique de la variable pour la retrouver
 * @param string $nom Nom de la variable
 * @param string $indice Indice ou nom supplementaire
 */
 Function detruire_configuration ($identification, $nom, $indice)
  {
   Global $id_sql ;
   $res = SQL_commande ("DELETE FROM configuration WHERE identification='".$identification."' AND nom='".$nom."' AND indice='".$indice."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
  }

 /**
 * Sauvegarde le delta millesime
 * @param string $delta_millesime Difference de millesime
 * @return int 1=MAJ, 2=Creation
 */
 Function sauvegarde_configuration_delta_millesime ($delta_millesime)
  {
   Global $id_sql ;
   $ok = 0 ;
   $res = SQL_commande ("SELECT id_configuration FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='GENERAL' AND indice='DELTA_MILLESIME' AND millesime='' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     // Existe
     $conf = SQL_ligne_suivante ($res) ;
     $res = SQL_commande ("UPDATE configuration SET valeur='".$delta_millesime."' WHERE id_configuration='".$conf [0]."' LIMIT 1", $id_sql) ;
     $ok = 1 ;
    }
   Else
    {
     // N'existe pas -> insertion
     $res = SQL_commande ("INSERT INTO configuration (identification,nom,indice,valeur,millesime) VALUES ('SYSTEME_PARAM','GENERAL','DELTA_MILLESIME','".$delta_millesime."','')", $id_sql) ;
     $ok = 2 ;
    }
   Return $ok ;
  }

 /**
 * Restauration de la valeur de delta millesime
 * @return int delta millesime (si n'existe pas retourne 0)
 */
 Function restaure_configuration_delta_millesime ()
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT valeur FROM configuration WHERE identification='SYSTEME_PARAM' AND nom='GENERAL' AND indice='DELTA_MILLESIME' AND millesime='' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1) { $v = SQL_ligne_suivante ($res) ; } Else { $v [0] = 0 ; }
   Return $v [0] ;
  }

 /**
 * Retrouve la valeur de la variable courant passee en POST ou GET
 * @param string $nom Nom de la variable
 * @param int $mode Mode=0:POST et GET,1:POST,2:GET
 * @param mixed $defaut Valeur par defaut si non trouvee
 * @return mixed Contenu de la variable
 */
 Function var_courante ($nom, $mode, $defaut)
  {
   Global $debug_SQL, $debug_fonction ;
   Switch ($mode)
    {
     Default :
      Case 0 : $variable = IsSet ($_POST [$nom]) ? $_POST [$nom] : (IsSet ($_GET [$nom]) ? $_GET [$nom] : $defaut) ; Break ;
      Case 1 : $variable = IsSet ($_POST [$nom]) ? $_POST [$nom] : $defaut ; Break ;
      Case 2 : $variable = IsSet ($_GET [$nom]) ? $_GET [$nom] : $defaut ; Break ;
    }
   // Conversion dans le bon jeu de caracteres
   $jeux_car = Explode (",", $_SERVER ["HTTP_ACCEPT_CHARSET"]) ;
   If (SubStr ($jeux_car [0], StrLen ($jeux_car [0]), 1) == " ") { $jeux_car [0] = SubStr ($jeux_car [0], 0, StrLen ($jeux_car [0])-1) ; }
   If (Function_Exists ("iconv")) { $variable2 = iconv ($jeux_car [0], "UTF-8", $variable) ; }
   Else { $variable2 = $variable ; }
   If ($debug_fonction == 1) { Echo "Variable&nbsp;(".$jeux_car [0].")<b>\$".$nom."</b>&nbsp;=&nbsp;".$variable."->".$variable2."<br>" ; }
   Return $variable ;
  }

 /**
 * Retrouve le premier RNE de l'etablisement gere
 * @param int $millesime Annee
 * @return string Numero RNE premier etablissement trouve
 */
 Function retrouve_rne ($millesime)
  {
   Global $id_sql ;
   $v [0] = restaure_configuration ("SYSTEME_PARAM", "RNE", "GESTION") ;
   If ($v [0] == "")
    {
     $res = SQL_commande ("SELECT numero FROM etablissements WHERE numero!='' AND millesime='".$millesime."' ORDER BY numero LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($res) == 1) { $v = SQL_ligne_suivante ($res) ; sauvegarde_configuration ("SYSTEME_PARAM", "RNE", "GESTION", $v [0]) ; }
     Else { $v [0] = "" ; sauvegarde_configuration ("SYSTEME_PARAM", "RNE", "GESTION", Session_Id ()) ; }
    }
   Return $v [0] ;
  }
 
 /**
 * Sauvegarde d'un fichier complet
 * @param int $millesime Milleisme courant
 * @param string $nom Nom du fichier
 * @param string $emplacement Emplacement du fichier avec chemin et nom
 */
 Function sauvegarde_fichier ($millesime, $nom, $emplacement)
  {
   Global $id_sql ;
   // Existe ?
   $r0 = SQL_commande ("SELECT numero FROM fichiers WHERE nom='".$nom."' ORDER BY numero DESC LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r0) == 1)
    {
     $l1 = SQL_ligne_suivante ($r0) ;
     $numero = $l1 [0]+1 ;
    }
   Else { $numero = 1 ; }
   $chaine = @Implode ("", @File ($emplacement)) ;
   $chaine = AddSlashes ($chaine) ;
   $requete = "INSERT INTO fichiers (millesime,nom,numero,contenu) VALUES ('".$millesime."','".$nom."','".$numero."','".$chaine."')" ;
   $ok = SQL_commande ($requete, $id_sql) ;
  }
 
 // ===============================================================================
 //  GESTION DES DISCIPLINES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi la valeur d'id_discipline la plus elevee
 * @return int Valeur MAX de l'id_discipline
 */
 Function max_disciplines ()
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT max(id_discipline) FROM disciplines WHERE millesime='".millesime (0)."'", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
  }

 /**
 * Renvoi le nom du champ $nom de la discipline $i
 * @param string $nom Nom du champs a renvoyer
 * @param int $id_discipline Id unique de la discipline
 * @return string Valeur du champ
 */
 Function nom_disc_parid ($nom, $id_discipline)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT ".$nom." FROM disciplines WHERE id_discipline='".$id_discipline."' LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
  }
 
 /**
 * Renvoi le contenu d'un champ $nom_champ de la discipline $i
 * @param string $nom_champ Nom du champs a renvoyer
 * @param int $id_discipline Id unique de la discipline
 * @return string Valeur du champ sans filtrage
 */
 Function champ_disc_parid ($nom_champ, $id_discipline)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT ".$nom_champ." FROM disciplines WHERE id_discipline='".$id_discipline."' LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
  }
 
 /**
 * Renvoi le nom LONG de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function nom_disc_long_parid ($i)
  {
   Return nom_disc_parid ("nom_long", $i) ;
  }
 
 /**
 * Renvoi le nom COURT de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function nom_disc_court_parid ($i)
  {
   Return nom_disc_parid ("nom_court", $i) ;
  }

 /**
 * Renvoi le nom BREF de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function nom_disc_bref_parid ($i)
  {
   Return nom_disc_parid ("nom_bref", $i) ;
  }

 /**
 * Renvoi le contenu du champ type_discipline de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function champ_disc_type_discipline_parid ($i)
  {
   Return champ_disc_parid ("type_discipline", $i) ;
  }
 
 /**
 * Renvoi le contenu du champ type_moyenne de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function champ_disc_type_moyenne_parid ($i)
  {
   Return champ_disc_parid ("type_moyenne", $i) ;
  }
 
 /**
 * Renvoi le contenu du champ type_arrondi de la discipline
 * @param int $i Id unique de la discipline
 * @return string Valeur du champ
 */
 Function champ_disc_type_arrondi_parid ($i)
  {
   Return champ_disc_parid ("type_arrondi", $i) ;
  }
 
 /**
 * Renvoi le contenu du champ type_discipline de la discipline
 * @param int $id_service_prof Identifiant unique du service prof
 * @return string Valeur du champ
 */
 Function champ_disc_type_discipline_par_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT discipline FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     $r = SQL_ligne_suivante ($res) ;
     Return champ_disc_parid ("type_discipline", $r [0]) ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi le contenu du champ type_moyenne de la discipline
 * @param int $id_service_prof Identifiant unique du service prof
 * @return string Valeur du champ
 */
 Function champ_disc_type_moyenne_par_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT discipline FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     $r = SQL_ligne_suivante ($res) ;
     Return champ_disc_parid ("type_moyenne", $r [0]) ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi le contenu du champ type_arrondi de la discipline
 * @param int $id_service_prof Identifiant unique du service prof
 * @return string Valeur du champ
 */
 Function champ_disc_type_arrondi_par_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $res = SQL_commande ("SELECT discipline FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($res) == 1)
    {
     $r = SQL_ligne_suivante ($res) ;
     Return champ_disc_parid ("type_arrondi", $r [0]) ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi 0 si non optionnel et 1 si optionnel
 * @param int $d Id unique de la discipline correspondante
 * @param int $c Id unique de la classe a traiter
 * @param int $sc Id unique du service classe
 * @return int Valeur du champ optionnelle si existe, sinon -1
 */
 Function estoptionnelle ($d, $c, $sc)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT optionnelle FROM services_classe WHERE classe='".$c."' AND discipline='".$d."' AND id_service_classe='".$sc."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi le nom long de la discipline en fonction de l'identifiant du service prof
 * @param int $id_service_prof Identifiant du service prof
 * @return string Valeur du champ
 */
 Function nom_discipline_long_par_id_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   If ($id_service_prof > 0)
    {
     $resultat = SQL_commande ("SELECT d.nom_long FROM disciplines d,services_prof s WHERE d.id_discipline=s.discipline AND s.id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       Return $ligne [0] ;
      }
     Else { Return "" ; }
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoi le nom court de la discipline en fonction de l'identifiant du service prof
 * @param int $id_service_prof Identifiant du service prof
 * @return string Valeur du champ
 */
 Function nom_discipline_court_par_id_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   If ($id_service_prof > 0)
    {
     $resultat = SQL_commande ("SELECT d.nom_court FROM disciplines d,services_prof s WHERE d.id_discipline=s.discipline AND s.id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       Return $ligne [0] ;
      }
     Else { Return "" ; }
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoi le nom bref de la discipline en fonction de l'identifiant du service prof
 * @param int $id_service_prof Identifiant du service prof
 * @return string Valeur du champ
 */
 Function nom_discipline_bref_par_id_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   If ($id_service_prof > 0)
    {
     $resultat = SQL_commande ("SELECT d.nom_bref FROM disciplines d,services_prof s WHERE d.id_discipline=s.discipline AND s.id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       Return $ligne [0] ;
      }
     Else { Return "" ; }
    }
   Else { Return "" ; }
  }

 // ===============================================================================
 //  GESTION DES GROUPES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi le nom du groupe d'ID $id_groupe
 * @param int $id_groupe Id unique du groupe classe a traiter
 * @return string Valeur du champ
 */
 Function nom_groupe_parid ($id_groupe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT code_groupe FROM groupes_classe WHERE id_groupe_classe='".$id_groupe."'", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
  }
 
 /**
 * Renvoi 0 si n'appartient pas au groupe et 1 sinon
 * @param int $id_el Id unique de l'eleve
 * @param int $id_groupe Id unique du groupe a traiter
 * @return int 0 ou 1
 */
 Function appartient_au_groupe ($id_el, $id_groupe)
  {
   Global $id_sql ;
   If ($id_groupe > 0)
    {
     $resultat = SQL_commande ("SELECT id_groupe_eleve FROM groupes_eleve WHERE eleve='".$id_el."' AND groupe='".$id_groupe."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1) { Return 1 ; } Else { Return 0 ; }
    }
   Else { Return 0 ; }
  }

 /**
 * Renvoi le nombre d'eleves dans le groupe id_groupe
 * @param int $id_groupe Identifiant du groupe
 * @return int Nombre d'eleves
 */
 Function effectif_groupe ($id_groupe)
  {
   Global $id_sql ;
   If ($id_groupe > 0)
    {
     $resultat = SQL_commande ("SELECT COUNT(id_groupe_eleve) FROM groupes_eleve WHERE groupe='".$id_groupe."'", $id_sql) ;
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Return 0 ;
  }

 // ===============================================================================
 //  GESTION DES SERVICES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi si oui ou non certaines disciplines d'une classe n'appartiennent pas a un groupement
 * @param int $id_classe Identifiant de la classe
 * @return int 1=Existance de disciplines sans groupe, 0=Toutes les disciplines appartiennent a un goupement
 */
 Function groupement_toute_discipline ($id_classe)
  {
   Global $id_sql ;
   // Nombre total de disciplines dans une classe
   $r1 = SQL_commande ("SELECT COUNT(id_service_prof) FROM services_prof WHERE classe='".$id_classe."'", $id_sql) ;
   $nbr1 = SQL_ligne_suivante ($r1) ;
   // Nombre de disciplines atribuee
   $r2 = SQL_commande ("SELECT COUNT(g.id_service_prof) FROM services_prof s,groupement_disciplines_attribution g WHERE s.classe='".$id_classe."' AND s.id_service_prof=g.id_service_prof AND g.id_groupement_discipline_definition>0", $id_sql) ;
   $nbr2 = SQL_ligne_suivante ($r2) ;
   If ($nbr1 [0] == $nbr2 [0]) { Return 0 ; } Else { Return 1 ; } 
  }
 
 /**
 * Renvoi si oui ou non le service prof appartient a un groupe
 * @param int $id_service_prof Identifiant du service prof
 * @param int $millesime Millesime
 * @param ressource $id_sql Identifiant de connexion SQL
 * @return int 0=Pas de groupe, >0=Identifiant du groupe de disciplines
 */
 Function groupement_service_prof ($id_service_prof,$millesime,$id_sql)
  {
   Global $debug_SQL ;
   $r = SQL_commande ("SELECT id_groupement_discipline_definition FROM groupement_disciplines_attribution
                        WHERE id_service_prof='".$id_service_prof."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $n = SQL_ligne_suivante ($r) ;
     Return $n [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi les caracteristiques d'un groupement
 * @param int $id_service_prof Identifiant du service prof
 * @param int $millesime Millesime
 * @param ressource $id_sql Identifiant de connexion SQL
 * @return array [0]=id_classe,[1]=nom,[2]=code,[3]=credit (avec ,),[4]=coefficient (avec ,),[5]=position
 */
 Function groupement_nom_groupe ($id_groupement_discipline_definition,$millesime,$id_sql)
  {
   Global $debug_SQL ;
   $r = SQL_commande ("SELECT id_classe,nom,code,credit,coefficient,position FROM groupement_disciplines_definition
                        WHERE id_groupement_discipline_definition='".$id_groupement_discipline_definition."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $n = SQL_ligne_suivante ($r) ;
     $n [3] = Str_Replace (".",",",$n [3]) ;
     $n [4] = Str_Replace (".",",",$n [4]) ;
     Return $n ;
    }
   Else { Return Array ("","","","","","") ; }
  }
 
 /**
 * Renvoi sous forme d'un tableau le nom des groupements existants seulement
 * @param int $id_classe Id unique de la classe
 * @param int $millesime Millesime de visualisation
 * @return array [0][0]=Nombre de groupements
 *               [$x][0] = Id
 *               [$i][1] = Nom
 *               [$i][2] = Code
 *               [$i][3] = Credit
 *               [$i][4] = Coefficient
 *               [$i][5] = Position
 *            Si existe sinon renvoi le groupement de la classe entiere avec classement (si existe)
 */
 Function groupement_disciplines ($id_classe, $millesime)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT * FROM groupement_disciplines_definition WHERE id_classe='".$id_classe."' AND millesime='".$millesime."' ORDER BY position,nom,code", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($resultats) ;
   If ($table [0][0] > 0)
    {
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $res = SQL_tableau_associatif ($resultats, "") ;
       $table [$i][0] = $res ["id_groupement_discipline_definition"] ;
       $table [$i][1] = $res ["nom"] ;
       $table [$i][2] = $res ["code"] ;
       $table [$i][3] = $res ["credit"] ;
       $table [$i][4] = $res ["coefficient"] ;
       $table [$i][5] = $res ["position"] ;
      }
    }
   Else
    {
     $table [0][0] = 1 ;
     $table [1][0] = -1 ;
     $table [1][1] = "" ;
    }
   Return $table ;
  }
 
 /**
 * Renvoi sous forme d'un tableau les groupements et non groupement si existe
 * @param int $id_classe Id unique de la classe
 * @param int $millesime Millesime de visualisation
 * @return array [0][0]=Nombre de groupements
 *               [$x][0] = Id
 *               [$i][1] = Nom
 *               [$i][2] = Code
 *               [$i][3] = Credit
 *               [$i][4] = Coefficient
 *               [$i][5] = Position
 *            Si existe sinon renvoi le groupement de la classe entiere avec classement (si existe)
 */
 Function groupement_toutes_disciplines ($id_classe, $millesime)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT * FROM groupement_disciplines_definition WHERE id_classe='".$id_classe."' AND millesime='".$millesime."' ORDER BY position,nom,code", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($resultats) ;
   If ($table [0][0] > 0)
    {
     $ok_sans_groupe = groupement_toute_discipline ($id_classe) ;
     If ($ok_sans_groupe == 1)
      {
       $table [0][0]++ ;
       $table [1][0] = $table [1][5] = 0 ;
       $table [1][1] = $table [1][2] = $table [1][3] = "" ;
       $table [1][4] = 1 ;
      }
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $res = SQL_tableau_associatif ($resultats, "") ;
       $table [$i+$ok_sans_groupe][0] = $res ["id_groupement_discipline_definition"] ;
       $table [$i+$ok_sans_groupe][1] = $res ["nom"] ;
       $table [$i+$ok_sans_groupe][2] = $res ["code"] ;
       $table [$i+$ok_sans_groupe][3] = $res ["credit"] ;
       $table [$i+$ok_sans_groupe][4] = $res ["coefficient"] ;
       $table [$i+$ok_sans_groupe][5] = $res ["position"] ;
      }
    }
   Else
    {
     $table [0][0] = 1 ;
     $table [1][0] = -1 ;
     $table [1][1] = "" ;
    }
   Return $table ;
  }
 
 /**
 * Renvoi la structure pedagogique d'une classe
 * @param int $id_classe Id unique de la classe
 * @param int $id_groupe_disc Id unique d'un groupe de discipline (0=Non attribues,-1=Toutes les disciplines avec classement,-2=Toutes les disciplines par ordre alphabetique)
 * @param int $millesime Millesime de visualisation
 * @return mixed Structure (retour directe du SQL)
 *  Format : id_discipline,nom_bref,nom_court,nom_long,                                  optionnelle,groupe,id_service_classe,coefficient,professeur,numen_prof,id_service_prof,groupe_classe,discipline,sous_discipline,coefficient_vs,id_groupement_discipline_definition
 *  Format : id_discipline,nom_bref,nom_court,nom_long,code,type_discipline,type_moyenne,optionnelle,groupe,id_service_classe,coefficient,professeur,numen_prof,id_service_prof,groupe_classe,discipline,sous_discipline,coefficient_vs,id_groupement_discipline_definition
 *  Numero :        0     ,    1   ,    2    ,   3    ,  4 ,      5        ,     6      ,    7      ,   8  ,       9         ,     10    ,     11   ,    12    ,      13       ,     14      ,    15    ,     16        ,        17    ,          18
 */
 Function structure_pedagogique ($id_classe, $id_groupe_disc, $millesime)
  {
   Global $id_sql,$debug_journal,$debug_SQL ;
   
   If (!IsSet ($id_groupe_disc)) { $id_groupe_disc = -1 ; }
   $ok = SQL_commande ("SELECT COUNT(id_groupement_discipline_attribution) FROM groupement_disciplines_attribution", $id_sql) ;
   $nbr_groupe = SQL_ligne_suivante ($ok) ;
   If (($id_groupe_disc > 0) And ($nbr_groupe [0] > 0))
    {
     $requete_plus_1 = ",g.id_groupement_discipline_definition" ;
     $requete_plus_2 = ",groupement_disciplines_attribution g" ;
     $requete_plus_3 = "AND g.id_groupement_discipline_definition='".$id_groupe_disc."' AND g.id_service_prof=p.id_service_prof " ;
    }
   ElseIf ($id_groupe_disc == 0)
    {
     // Recherche de tous les services profs
     $serv_sg = SQL_commande ("SELECT id_service_prof FROM services_prof WHERE classe='".$id_classe."' AND millesime='".$millesime."'", $id_sql) ;
     $liste_sp [0] = SQL_nbr_lignes ($serv_sg) ;
     For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_sg) ;
       $liste [$sp [0]] = 1 ;
       $liste_sp [$i] = $sp [0] ;
      }
     // Recherche de tous les services profs avec groupe
     $serv_ag = SQL_commande ("SELECT p.id_service_prof FROM services_prof p,groupement_disciplines_attribution g WHERE p.classe='".$id_classe."' AND p.millesime='".$millesime."' AND g.id_service_prof=p.id_service_prof", $id_sql) ;
     $liste [0] = SQL_nbr_lignes ($serv_ag) ;
     For ($i = 1 ; $i <= $liste [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_ag) ;
       $liste [$sp [0]] = 0 ;
      }
     // Difference
     $requete_plus_1 = $requete_plus_2 = $requete_plus_3 = "" ;
     $lst = 0 ;
     If (($liste_sp [0]-$liste [0]) > 0)
      {
       $requete_tmp = "" ;
       For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
        {
         If ($liste [$liste_sp [$i]]  == 1)
          {
	   If ($lst > 0) { $requete_tmp .= " OR " ; }
           $requete_tmp .= "p.id_service_prof='".$liste_sp [$i]."'" ; $lst++ ;
          }
        }
       If ($lst > 1) { $requete_plus_3 = "AND (".$requete_tmp.") " ; }
       ElseIf ($lst > 0) { $requete_plus_3 = "AND ".$requete_tmp." " ; }
      }
    }
   Else { $requete_plus_1 = $requete_plus_2 = $requete_plus_3 = "" ; }
   
   // Recherche classement ou pas
   $resultat = SQL_commande ("SELECT classement FROM classes WHERE id_classe='".$id_classe."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   $res = SQL_ligne_suivante ($resultat) ;
   $groupe_ok = groupement_toute_discipline ($id_classe) ;
   If (($id_groupe_disc == -1) And ($groupe_ok == 0) And ($res [0] == 1)) { $res [0] = 0 ; }
   If (($id_groupe_disc != -2) Or (($id_groupe_disc == 0) And ($lst > 0)))
    {
     If ($res [0] == 1)
      {
       $requete  = "SELECT DISTINCT d.id_discipline,d.nom_bref,d.nom_court,d.nom_long,d.code,d.type_discipline,d.type_moyenne,s.optionnelle,s.groupe,s.id_service_classe,p.coefficient,p.professeur," ;
       $requete .= " p.numen_prof,p.id_service_prof,p.groupe_classe,p.discipline,p.sous_discipline,a.coefficient_vs".$requete_plus_1 ;
       $requete .= " FROM disciplines d,services_classe s,services_prof p,classement c,classes a".$requete_plus_2 ;
       $requete .= " WHERE s.classe='".$id_classe."' AND p.classe='".$id_classe."' " ;
       $requete .= " AND s.discipline=d.id_discipline AND p.discipline=d.id_discipline" ;
       $requete .= " AND s.id_service_classe=p.service_classe" ;
       $requete .= " AND c.id_classe='".$id_classe."' AND c.id_service_classe=s.id_service_classe" ;
       $requete .= " AND a.id_classe='".$id_classe."' AND a.millesime='".$millesime."' ".$requete_plus_3 ;
       $requete .= " ORDER BY c.numero" ;
       $resultat = SQL_commande ($requete, $id_sql) ;
       $res [0] = SQL_nbr_lignes ($resultat) ;
      }
    }
   Else { $res [0] = 0 ; }
   // Pas de classement ou classement vide alors ordre alphabetique
   If (($res [0] == 0) And (($id_groupe_disc <= 0) Or (($id_groupe_disc > 0) And ($requete_plus_1 != ""))))
    {
     $requete  = "SELECT DISTINCT d.id_discipline,d.nom_bref,d.nom_court,d.nom_long,d.code,d.type_discipline,d.type_moyenne,s.optionnelle,s.groupe,s.id_service_classe,p.coefficient,p.professeur," ;
     $requete .= " p.numen_prof,p.id_service_prof,p.groupe_classe,p.discipline,p.sous_discipline,a.coefficient_vs".$requete_plus_1 ;
     $requete .= " FROM disciplines d,services_classe s,services_prof p,classes a".$requete_plus_2 ;
     $requete .= " WHERE s.classe='".$id_classe."' AND p.classe='".$id_classe."'" ;
     $requete .= " AND s.discipline=d.id_discipline AND p.discipline=d.id_discipline" ;
     $requete .= " AND s.id_service_classe=p.service_classe AND a.id_classe='".$id_classe."' AND a.millesime='".$millesime."' ".$requete_plus_3 ;
     $requete .= " ORDER BY d.nom_court,p.id_service_prof,s.id_service_classe" ;
     $resultat = SQL_commande ($requete, $id_sql) ;
    }
   
   Return $resultat ;
  }

 /**
 * Renvoi l'id_classe d'un service prof
 * @param int $id_service_prof Id unique du service prof
 * @return int Identifiant de la classe si existe sinon 0
 */
 Function classe_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT classe FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { $ligne = SQL_ligne_suivante ($resultat) ; Return $ligne [0] ; } Else { Return 0 ; }
  }

 /**
 * Renvoi l'id_service_classe d'un service prof
 * @param int $id_service_prof Id unique du service prof
 * @return int Identifiant du service classe si existe sinon 0
 */
 Function service_classe_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT service_classe FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { $ligne = SQL_ligne_suivante ($resultat) ; Return $ligne [0] ; } Else { Return 0 ; }
  }

 /**
 * Renvoi l'id_discipline d'un service prof
 * @param int $id_service_prof Id unique du service prof
 * @return int Identifiant de la discipline si existe sinon 0
 */
 Function discipline_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT discipline FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { $ligne = SQL_ligne_suivante ($resultat) ; Return $ligne [0] ; } Else { Return 0 ; }
  }
 
 /**
 * Renvoi si l'eleve id_eleve suit le cours de service prof id_service_prof
 * @param int $id_eleve Identifiant de l'eleve
 * @param int $id_service_prof Identifiant du service prof
 * @param int 0=Non, 1=Oui
 */
 Function eleve_suit_cours_service_prof ($id_eleve, $id_service_prof)
  {
   Global $id_sql ;
   $ok = 0 ;
   $car = SQL_commande ("SELECT c.optionnelle,c.groupe,p.groupe_classe,c.id_service_classe,c.discipline FROM services_classe c,services_prof p WHERE p.id_service_prof='".$id_service_prof."' AND p.service_classe=c.id_service_classe LIMIT 1", $id_sql) ;
   //echo "SELECT c.optionnelle,c.groupe,p.groupe_classe,c.id_service_classe,c.discipline FROM services_classe c,services_prof p WHERE p.id_service_prof='".$id_service_prof."' AND p.service_classe=c.id_service_classe LIMIT 1<br>" ;
   If (SQL_nbr_lignes ($car) == 1)
    {
     //echo "1<br>" ;
     $sc = SQL_ligne_suivante ($car) ;
     If (($sc [0] == 0) AND ($sc [1] == 0)) { $ok = 1 ; }
     Else
      {
       If ($sc [0] != 0)
        {
	 // Optionnelle : Eleve suit-il l'option ?
	 $opt = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$id_eleve."' AND discipline='".$sc [4]."' AND service_classe='".$sc [3]."' LIMIT 1", $id_sql) ;
	 //echo "SELECT id_option_eleve FROM options_eleve WHERE eleve='".$id_eleve."' AND discipline='".$sc [4]."' AND service_classe='".$sc [3]."' LIMIT 1<br>" ;
	 If (SQL_nbr_lignes ($opt) == 1) { $ok = 1 ; }
	}
       ElseIf ($sc [1] != 0)
        {
	 // Groupe : Appartient au groupe ?
	 $grp = SQL_commande ("SELECT id_groupe_eleve FROM groupes_eleve WHERE eleve='".$id_eleve."' AND discipline='".$sc [4]."' AND groupe='".$sc [2]."' LIMIT 1", $id_sql) ;
	 //echo "SELECT id_groupe_eleve FROM groupes_eleve WHERE eleve='".$id_eleve."' AND discipline='".$sc [3]."' AND groupe='".$sc [2]."' LIMIT 1<br>" ;
	 If (SQL_nbr_lignes ($grp) == 1) { $ok = 1 ; }
	}
      }
    }
   //echo $ok."<br>" ;
   Return $ok ;
  }
 
 /**
 * Renvoi si la discipline est une langue vivante
 * @param int $id_sous_discipline Identifiant de la sous-discipline
 * @return int 0:Non, 1-4:Numero LV
 */
 Function discipline_langue_vivante ($id_discipline)
  {
   Global $id_sql ;
   $ok = 0 ;
   $disc = SQL_commande ("SELECT id_type_discipline FROM disciplines WHERE id_discipline='".$id_discipline."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($disc) == 1)
    {
     $sd = SQL_ligne_suivante ($disc) ;
     If ($sd [0] != 0)
      {
       $type_disc = SQL_commande ("SELECT code FROM types_disciplines WHERE id_type_discipline='".$sd [0]."' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($type_disc) == 1)
        {
	 $code = SQL_ligne_suivante ($type_disc) ;
	 $cd = Explode ("|", $code [0]) ;
	 If ($cd [0] == "LV")
	  {
	   // Faire une lecture du numero de LV
	   $ok = 1 ;
	  }
	}
      }
    }
   Return $ok ;
  }
 
 /**
 * Renvoi si la sous-discipline est une specialite
 * @param int $id_sous_discipline Identifiant de la sous-discipline
 * @return int 0:Non, 1:Oui
 */
 Function sous_discipline_specialite ($id_sous_discipline)
  {
   Global $id_sql ;
   $ok = 0 ;
   $sous_disc = SQL_commande ("SELECT type FROM sous_disciplines WHERE id_sous_discipline='".$id_sous_discipline."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($sous_disc) == 1)
    {
     $sd = SQL_ligne_suivante ($sous_disc) ;
     $ok = $sd [0] & 1 ;
    }
   Return $ok ;
  }
 
 /**
 * Renvoi le numero de la langue vivante de la sous-discipline si existe
 * @param int $id_sous_discipline Identifiant de la sous-discipline
 * @return int 0:Non, 1-4:Numero LV
 */
 Function sous_discipline_langue_vivante ($id_sous_discipline)
  {
   Global $id_sql ;
   $ok = 0 ;
   $sous_disc = SQL_commande ("SELECT type FROM sous_disciplines WHERE id_sous_discipline='".$id_sous_discipline."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($sous_disc) == 1)
    {
     $sd = SQL_ligne_suivante ($sous_disc) ;
     $ok = $sd [0]>>1 ;
    }
   Return $ok ;
  }
 
 // ===============================================================================
 //  GESTION DES ALIAS
 // -------------------------------------------------------------------------------
 /**
 * Verifie l'existance d'un alias dans un service classe
 * @param int $id_classe Identifiant de la classe
 * @return int Si alias existe alors 1 sinon 0
 */
 Function alias_classe ($id_classe)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT g.id_groupe_alias FROM services_classe c,groupes_alias g,alias a WHERE c.classe='".$id_classe."' AND c.id_service_classe=g.id_service_classe AND g.id_groupe_alias=a.id_alias LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { Return 1 ; } Else { Return 0 ; }
  }

 /**
 * Renvoi les enseignants d'une discipline en equipe (alias)
 * @param int $id_alias Identifiant de l'alias
 * @return array Tableau contenant : [0][0]=Nombre
 *                                   [x][0]=Numero dans l'alias
 *                                   [x][1]=Id enseignant
 *                                   [x][2]=Civilite
 *                                   [x][3]=Nom
 *                                   [x][4]=Prenom
 */
 Function alias_liste_enseignants ($id_alias)
  {
   Global $id_sql ;
   If ($id_alias < 0) { $id_alias = -$id_alias ; }
   $resultats = SQL_commande ("SELECT a.numero,u.id_utilisateur,u.civilite,u.nom,u.prenom FROM utilisateurs u,groupes_alias a WHERE a.id_alias='".$id_alias."' AND a.id_utilisateur=u.id_utilisateur ORDER BY u.nom,u.prenom", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($resultats) ;
   If ($table [0][0] > 0)
    {
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $l = SQL_ligne_suivante ($resultats) ;
       $table [$i][0] = $l [0] ;
       $table [$i][1] = $l [1] ;
       $table [$i][2] = $l [2] ;
       $table [$i][3] = $l [3] ;
       $table [$i][4] = $l [4] ;
      }
    }
   Return $table ;
  }
 
 /**
 * Renvoi l'enseignant principal d'une discipline en equipe (le premier)
 * @param int $id_alias Identifiant de l'alias
 * @return array Tableau contenant : [0]=Id enseignant
 *                                   [1]=Civilite
 *                                   [2]=Nom
 *                                   [3]=Prenom
 */
 Function alias_enseignant_principal ($id_alias)
  {
   Global $id_sql ;
   If ($id_alias < 0) { $id_alias = -$id_alias ; }
   $resultats = SQL_commande ("SELECT u.id_utilisateur,u.civilite,u.nom,u.prenom FROM utilisateurs u,groupes_alias a WHERE a.id_alias='".$id_alias."' AND a.id_utilisateur=u.id_utilisateur AND a.numero='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1)
    {
     $l = SQL_ligne_suivante ($resultats) ;
     $table [0] = $l [0] ;
     $table [1] = $l [1] ;
     $table [2] = $l [2] ;
     $table [3] = $l [3] ;
    }
   Else { $table [0] = $table [1] = $table [2] = $table [3] = "" ; }
   Return $table ;
  }
 
 // ===============================================================================
 //  GESTION DE L'ORDRE DES SERVICES
 // -------------------------------------------------------------------------------
 /**
 * Verifie l'existence d'un ordre de services dans une classe
 * @param int $id_classe Identifiant de la classe
 * @return int Si ordre existe alors 1 sinon 0
 */
 Function ordre_classe ($id_classe)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT id_classement FROM classement WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { Return 1 ; } Else { Return 0 ; }
  }
 
 /**
 * Verifie l'existence d'un ordre de services dans une classe pour un groupement particulier
 * @param int $id_classe Identifiant de la classe
 * @param int $id_grp Identifiant du groupement
 * @return int Si ordre existe alors 1 sinon 0
 */
 Function ordre_groupement_classe ($id_classe, $id_grp, $millesime)
  {
   Global $id_sql ;
   If ($id_grp > 0)
    {
     $resultats = SQL_commande ("SELECT c.id_classement FROM classement c,groupement_disciplines_attribution g,services_prof s
                                  WHERE g.id_groupement_discipline_definition='".$id_grp."' AND g.id_service_prof=s.id_service_prof
				    AND s.service_classe=c.id_service_classe AND c.id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultats) == 1) { Return 1 ; } Else { Return 0 ; }
    }
   ElseIf ($id_grp == 0)
    {
     // Recherche de tous les services profs
     $serv_sg = SQL_commande ("SELECT id_service_prof FROM services_prof WHERE classe='".$id_classe."' AND millesime='".$millesime."'", $id_sql) ;
     $liste_sp [0] = SQL_nbr_lignes ($serv_sg) ;
     For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_sg) ;
       $liste [$sp [0]] = 1 ;
       $liste_sp [$i] = $sp [0] ;
      }
     // Recherche de tous les services profs avec groupe
     $serv_ag = SQL_commande ("SELECT p.id_service_prof FROM services_prof p,groupement_disciplines_attribution g WHERE p.classe='".$id_classe."' AND p.millesime='".$millesime."' AND g.id_service_prof=p.id_service_prof", $id_sql) ;
     $liste [0] = SQL_nbr_lignes ($serv_ag) ;
     For ($i = 1 ; $i <= $liste [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_ag) ;
       $liste [$sp [0]] = 0 ;
      }
     // Difference
     $requete_plus = "" ;
     $lst = 0 ;
     If (($liste_sp [0]-$liste [0]) > 0)
      {
       $requete_tmp = "" ;
       For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
        {
         If ($liste [$liste_sp [$i]] == 1)
          {
	   If ($lst > 0) { $requete_tmp .= " OR " ; }
           $requete_tmp .= "p.id_service_prof='".$liste_sp [$i]."'" ; $lst++ ;
          }
        }
       If ($lst > 1) { $requete_plus = "AND (".$requete_tmp.") " ; }
       ElseIf ($lst > 0) { $requete_plus = "AND ".$requete_tmp." " ; }
      }
     If ($lst > 0)
      {
       $resultats = SQL_commande ("SELECT c.id_classement FROM classement c,services_prof p WHERE p.service_classe=c.id_service_classe AND c.id_classe='".$id_classe."' ".$requete_plus."LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($resultats) == 1) { Return 1 ; } Else { Return 0 ; }
      }
     Else { Return 0 ; }
    }
   Else { Return ordre_classe ($id_classe) ; }
  }
 
 /**
 * Renvoi le nombre de services classe en fonction du groupement
 * @param int $id_classe Identifiant de la classe
 * @param int $id_grp Identifiant du groupement (-1=Toute la classe)
 * @param int $millesime Millesime
 * @return int Nombre de services classes (0=Pas de classement)
 */
 Function ordre_nombre_service_classe_par_groupement ($id_classe, $id_grp, $millesime)
  {
   Global $id_sql ;
   If ($id_grp > 0)
    {
     $resultats = SQL_commande ("SELECT COUNT(c.id_classement),MAX(c.numero) FROM classement c,groupement_disciplines_attribution g,services_prof s
                                  WHERE g.id_groupement_discipline_definition='".$id_grp."' AND g.id_service_prof=s.id_service_prof
				    AND s.service_classe=c.id_service_classe AND c.id_classe='".$id_classe."'", $id_sql) ;
     $r = SQL_ligne_suivante ($resultats) ;
    }
   ElseIf ($id_grp == 0)
    {
     // Recherche de tous les services profs
     $serv_sg = SQL_commande ("SELECT id_service_prof FROM services_prof WHERE classe='".$id_classe."' AND millesime='".$millesime."'", $id_sql) ;
     $liste_sp [0] = SQL_nbr_lignes ($serv_sg) ;
     For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_sg) ;
       $liste [$sp [0]] = 1 ;
       $liste_sp [$i] = $sp [0] ;
      }
     // Recherche de tous les services profs avec groupe
     $serv_ag = SQL_commande ("SELECT p.id_service_prof FROM services_prof p,groupement_disciplines_attribution g WHERE p.classe='".$id_classe."' AND p.millesime='".$millesime."' AND g.id_service_prof=p.id_service_prof", $id_sql) ;
     $liste [0] = SQL_nbr_lignes ($serv_ag) ;
     For ($i = 1 ; $i <= $liste [0] ; $i++)
      {
       $sp = SQL_ligne_suivante ($serv_ag) ;
       $liste [$sp [0]] = 0 ;
      }
     // Difference
     $requete_plus = "" ;
     $lst = 0 ;
     If (($liste_sp [0]-$liste [0]) > 0)
      {
       $requete_tmp = "" ;
       For ($i = 1 ; $i <= $liste_sp [0] ; $i++)
        {
         If ($liste [$liste_sp [$i]] == 1)
          {
	   If ($lst > 0) { $requete_tmp .= " OR " ; }
           $requete_tmp .= "p.id_service_prof='".$liste_sp [$i]."'" ; $lst++ ;
          }
        }
       If ($lst > 1) { $requete_plus = "AND (".$requete_tmp.") " ; }
       ElseIf ($lst > 0) { $requete_plus = "AND ".$requete_tmp." " ; }
      }
     If ($lst > 0)
      {
       $resultats = SQL_commande ("SELECT COUNT(c.id_classement),MAX(c.numero) FROM classement c,services_prof p
                                    WHERE p.service_classe=c.id_service_classe AND c.id_classe='".$id_classe."' ".$requete_plus, $id_sql) ;
       $r = SQL_ligne_suivante ($resultats) ;
      }
     Else { $r [0] = $r [1] = 0 ; }
    }
   Else
    {
     $resultats = SQL_commande ("SELECT COUNT(id_classement),MAX(numero) FROM classement WHERE id_classe='".$id_classe."'", $id_sql) ;
     $r = SQL_ligne_suivante ($resultats) ;
    }
   // Renvoi le plus grand des deux
   If ($r [0] == $r [1]) { Return $r [0] ; } ElseIf ($r [0] < $r [1]) { Return $r [1] ; } Else { Return $r [0] ; }
  }
 
 /**
 * Fonction de renumerotation d'un classement existant
 * @param int $id_classe Identifiant de la classe
 * @param int $id_grp Identifiant du groupement (-1=Toutes les disciplines)
 * @param int $millesime Millesime
 * @return int 0=Non Ok,1=Ok
 */
 Function ordre_renumerotation ($id_classe, $id_grp, $millesime)
  {
   Global $id_sql ;
   If ($id_grp != -2)
    {
     $sp = structure_pedagogique ($id_classe, $id_grp, $millesime) ;
     $nbr = SQL_nbr_lignes ($sp) ;
     If ($nbr > 1)
      {
       For ($i = 1 ; $i <= $nbr ; $i++)
        {
         $ligne = SQL_ligne_suivante ($sp) ;
         $ok = SQL_commande ("UPDATE classement SET numero='".$i."' WHERE id_service_classe='".$ligne [4]."' AND id_classe='".$id_classe."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
        }
      }
     ElseIf ($nbr == 1)
      {
       $ligne = SQL_ligne_suivante ($sp) ;
       $ok = SQL_commande ("DELETE FROM classement WHERE id_service_classe='".$ligne [4]."' AND id_classe='".$id_classe."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
      }
     Else { Return 0 ; }
    }
   Else { Return 0 ; }
  }
 
 /**
 * Mise a jour de l'indicateur de classement pour une classe
 * @param int $id_classe Identifiant de la classe
 * @return int 0=Pas de classement,1=Classement existant
 */
 Function ordre_maj ($id_classe)
  {
   Global $id_sql ;
   $ok = SQL_commande ("SELECT id_classement FROM classement WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   $maj = (integer)SQL_nbr_lignes ($ok) ;
   $ok = SQL_commande ("UPDATE classes SET classement='".$maj."' WHERE id_classe='".$id_classe."' LIMIT 1" , $id_sql) ;
   Return $maj ;
  }
 
 // ===============================================================================
 //  GESTION DES CLASSES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi le nombe et les caracteristiques des etablissements geres pour un millesime
 * @param int $millesime Millesime a traiter
 * @return array
 * Format : [0][0]=Nombre d'etablissements
 *          [i][0]=Identifiant etab
 *          [i][1]=Nom
 *          [i][2]=Adresse
 *          [i][3]=Code Postal
 *          [i][4]=Ville
 *          [i][5]=Numero RNE
 */
 Function etablissements ($millesime)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_etablissement,nom,adresse,cp,ville,numero FROM etablissements WHERE millesime='".$millesime."'", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($resultat) ;
   For ($i = 1 ; $i <= $table [0][0] ; $i++)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     For ($j = 0 ; $j < 6 ; $j++)
      {
       $table [$i][$j] = $ligne [$j] ;
      }
    }
   Return $table ;
  }
 
 /**
 * Renvoi l'id etablissement de la classe $id_classe
 * @param int $i Id de la classe
 * @param int $millesime Millesime a traiter
 * @return int Identifiant etablissement
 */
 Function id_etablissement_par_id_classe ($id_classe)
  {
   Global $id_sql ;
   If ($id_classe > 0)
    {
     $resultat = SQL_commande ("SELECT etablissement FROM classes WHERE millesime='".millesime (0)."' AND id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 0) { Return 0 ; }
     Else
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       Return $ligne [0] ;
      }
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi le champ $nom de la classe $id_classe
 * @param string $nom Nom du champ
 * @param int $id_classe Id de la classe (<1 alors renvoie tous les champs sinon uniquement la classe concernee)
 * @return string Valeur du champ
 */
 Function classe_parid ($nom, $id_classe)
  {
   Global $id_sql ;
   If ($id_classe < 1) { $resultat = SQL_commande ("SELECT ".$nom." FROM classes WHERE millesime='".millesime (0)."' ORDER BY id_classe LIMIT 1", $id_sql) ; }
   Else { $resultat = SQL_commande ("SELECT ".$nom." FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ; }
   If (SQL_nbr_lignes ($resultat) == 0) { $resultat = SQL_commande ("SELECT ".$nom." FROM classes WHERE millesime='".millesime (0)."' ORDER BY id_classe LIMIT 1", $id_sql) ; }
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
  }
 
 /**
 * Renvoi le nom LONG de la classe
 * @param int $id_classe Id de la classe
 * @return string Valeur du champ
 */
 Function nom_classe_long_parid ($id_classe)
  {
   Return classe_parid ("nom", $id_classe) ;
  }
 
 /**
 * Renvoi le nom BREF de la classe
 * @param int $id_classe Id de la classe
 * @return string Valeur du champ
 */
 Function nom_classe_bref_parid ($id_classe)
  {
   Return classe_parid ("nom_bref", $id_classe) ;
  }

 /**
 * Renvoi le nombre d'eleves
 * @param int $id_classe Id de la classe
 * @return int Nombre d'eleves
 */
 Function effectif ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT COUNT(*) FROM eleves WHERE classe='".$id_classe."' AND millesime='".millesime (0)."' AND exterieur>='0'", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   If ($ligne [0] > 0) { Return $ligne [0] ; } Else { Return 0 ; }
  }

 /**
 * Changement de discipline pour un professeur sans effacer les notes
 * @param int $id_sp Id du service prof correspondant
 * @param int $id_disc_new Id de la nouvelle discipline
 * @return int 1=OK ; -2=Service prof inexistant ; -1=Nouvelle discipline non trouvee
 */
 Function change_discipline ($id_sp, $id_disc_new)
  {
   Global $id_sql ;
   // Recherche caracteristiques nouvelle discipline
   $car_disc = SQL_commande ("SELECT * FROM disciplines WHERE id_discipline='".$id_disc_new."' LIMIT 1", $id_sql) ;
   If ($car_disc)
    {
     $cdisc = SQL_tableau_associatif ($car_disc, "") ;
     $serv_prof = SQL_commande ("SELECT * FROM services_prof WHERE id_service_prof='".$id_sp."' LIMIT 1", $id_sql) ;
     If ($serv_prof)
      {
       $sp = SQL_tableau_associatif ($serv_prof, "") ;
       // Mise a jour du service prof
       $resultat = SQL_commande ("UPDATE services_prof SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE id_service_prof='".$id_sp."' LIMIT 1", $id_sql) ;
       // Mise a jour du service classe
       $serv_classe = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$sp ["service_classe"]."' LIMIT 1", $id_sql) ;
       $sc = SQL_tableau_associatif ($serv_classe, "") ;
       $resultat = SQL_commande ("UPDATE services_classe SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE id_service_classe='".$sp ["service_classe"]."' LIMIT 1", $id_sql) ;
       // Mise a jour des appreciations
       $resultat = SQL_commande ("UPDATE appreciations SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE service_prof='".$id_sp."'", $id_sql) ;
       // Mise a jour du calcul de moyennes
       $resultat = SQL_commande ("DELETE FROM calcul_moyenne WHERE classe='".$sp ["service_classe"]."' AND service_prof='".$sp ["id_service_prof"]."' AND service_classe='".$sp ["service_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
       // Mise a jour des controles
       $resultat = SQL_commande ("UPDATE controles SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE service_prof='".$id_sp."'", $id_sql) ;
       // Mise a jour des groupes de classe et des groupes eleves
       If ($sp ["groupe_classe"] > 0)
        {
         $resultat = SQL_commande ("UPDATE groupes_classe SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE id_groupe_classe='".$sp ["groupe_classe"]."'", $id_sql) ;
         $resultat = SQL_commande ("UPDATE groupes_eleve SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE groupe='".$sp ["groupe_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
        }
       // Mise a jour des options eleves
       If ($sc ["optionnelle"] > 0)
        {
         $resultat = SQL_commande ("UPDATE options_classe SET discipline='".$id_disc_new."',code_disc='".$cdisc ["code"]."' WHERE service_classe='".$sp ["service_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
        }
       Return 1 ; // OK
      }
     Else
      {
       Return -2 ; // Erreur : Le service prof n'existe pas
      }
    }
   Else
    {
     Return -1 ; // Erreur : Nouvelle discipline non trouvee
    }
  }
 
 /**
 * Renvoi l'identifiant du professeur principal d'une classe
 * @param int $id_classe Id de la classe
 * @return int Identifiant enseignant si existe sinon 0
 */
 Function professeur_principal ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_prof_princ FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   If ($ligne [0] > 0) { Return $ligne [0] ; } Else { Return 0 ; }
  }
 
 /**
 * Renvoi le type de saisie CPE d'une classe
 * @param int $id_classe Id de la classe
 * @return int Type de saisie
 */
 Function type_saisie_vie_scolaire ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT c.type_saisie_cpe,e.bulletin_cpe FROM classes c,etablissements e WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   If ($ligne [0] < 0) { Return $ligne [1] ; } Else { Return $ligne [0] ; }
  }
 
 /**
 * Renvoi la liste des classes d'un enseignant
 * @param int $id_utilisateur Identifiant de l'enseignant
 * @param int $millesime Millesime de parcours
 * @return array Tableau contenant les classes [0][0]=Nombre;[i][1]=id_classe;[i][2]=nom ou nom_bref;[i][3]=discipline
 */
 Function liste_classe_parid ($id_utilisateur, $millesime)
  {
   Global $id_sql ;
   // Chercher si alias possible
   $alias_s = SQL_commande("SELECT id_service_prof FROM groupes_alias WHERE id_utilisateur='".$id_utilisateur."' AND code='1' AND millesime='".$millesime."'", $id_sql) ;
   $nbr_alias = SQL_nbr_lignes ($alias_s) ;
   $requete = "SELECT DISTINCT c.id_classe,c.nom,c.nom_bref,s.discipline FROM services_prof s,classes c WHERE " ; If ($nbr_alias > 0) { $requete .= "(" ; }
   $requete .= "s.professeur='".$id_utilisateur."' AND s.classe=c.id_classe AND c.millesime='".$millesime."'" ;
   If ($nbr_alias > 0)
    {
     $requete .= ")" ;
     For ($ki = 0 ; $ki < $nbr_alias ; $ki++)
      {
       $ligne = SQL_ligne_suivante ($alias_s) ;
       $requete .= " OR (s.id_service_prof='".$ligne [0]."' AND s.classe=c.id_classe)" ;
      }
    }
   $requete .= " ORDER BY c.nom_bref,c.id_classe" ;
   $resultat = SQL_commande ($requete, $id_sql) ;
   $classes [0][0] = $classes [0][1] = 0 ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     $classes [0][1] = 1 ;
     $j = 0 ;
     While ($ligne = SQL_tableau_associatif ($resultat, ""))
      {
       If (!IsSet ($cl [$ligne ["id_classe"]])) { $cl [$ligne ["classe"]] = 0 ; }
       If (!$cl [$ligne ["id_classe"]])
        {
         $j++ ;
         $classes [0][0] = $j ;
         $classes [$j][1] = $ligne ["id_classe"] ;
         If ($ligne ["nom"]) { $classes [$j][2] = SubStr ($ligne ["nom"], 0, 14) ; } Else { $classes [$j][2] = SubStr ($ligne ["nom_bref"], 0, 14) ; }
         $classes [$j][3] = $ligne ["discipline"] ;
         $cl [$ligne ["classe"]] = 1 ;
        }
      }
    }
   Return $classes ;
  }

 /**
 * Renvoi la chaine de la signature de la classe $id_classe
 * @param int $id_classe Id de la classe (<1 alors renvoie tous les champs sinon uniquement la classe concernee)
 * @return string Valeur de la signature
 */
 Function signature_classe_parid ($id_classe)
  {
   Global $id_sql ;
   If ($id_classe > 0)
    {
     $resultat = SQL_commande ("SELECT s.nom FROM classes c,signatures s WHERE c.id_classe='".$id_classe."' AND c.signature=s.id_signature LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1) { $ligne = SQL_ligne_suivante ($resultat) ; Return $ligne [0] ; }
    }
   Return "" ;
  }

 // ===============================================================================
 //  GESTION DES PERIODES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi la date de la periode $numero (debut ou fin ou duree_vs ou duree_secr ou duree_dir)
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @param int $debut Numero du champ : 0=debut,1=fin,2=duree_vs,3=duree_secr,4=duree_dir
 * @return string Si numero invalide alors 1970-01-01 sinon si debut invalide alors 0000-00-00 sinon date
 */
 Function date_periode ($classe, $numero, $debut)
  {
   Global $id_sql ;
   // retourne la date de d�but de la periode $numero
   If ($numero < 1)
    {
     If (StrToUpper (SubStr (PHP_OS, 0, 3) == "WIN")) { Return "1980-01-01" ; } Else { Return "1970-01-01" ; }
    }
   //ElseIf ($numero > 3) { Return "9999-12-12" ; }
   Else
    {
     $resultat = SQL_commande ("SELECT debut,fin,duree_vs,duree_secr,duree_dir FROM periodes_classe WHERE classe='".$classe."' AND numero='".$numero."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
     $ligne = SQL_ligne_suivante ($resultat) ;
     If (($debut >= 0) And ($debut <= 4)) { Return $ligne [$debut] ; }
     Else { Return "0000-00-00" ; } 
    }
  }
 
 /**
 * Renvoi le debut de la periode
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @return string Date de debut de periode (voir fonction date_periode)
 */
 Function deb_periode ($classe, $numero)
  {
   Return date_periode ($classe, $numero, 0) ;
  }

 /**
 * Renvoi la fin de la periode
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @return string Date de fin de periode (voir fonction date_periode)
 */
 Function fin_periode ($classe, $numero)
  {
   Return date_periode ($classe, $numero, 1) ;
  }
 
 /**
 * Renvoi la duree de saisie de la vie scolaire
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @return string Date duree vie scolaire (voir fonction date_periode)
 */
 Function duree_vie_scolaire ($classe, $numero)
  {
   Return date_periode ($classe, $numero, 2) ;
  }

 /**
 * Renvoi la duree de saisie du secretariat
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @return string Date duree secretariat (voir fonction date_periode)
 */
 Function duree_secretariat ($classe, $numero)
  {
   Return date_periode ($classe, $numero, 3) ;
  }
 
 /**
 * Renvoi la duree de saisie de la direction
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @return string Date duree direction (voir fonction date_periode)
 */
 Function duree_direction ($classe, $numero)
  {
   Return date_periode ($classe, $numero, 4) ;
  }
 
 /**
 * Renvoi la fin de saisie relle
 * @param int $classe Id de la classe
 * @param int $numero Numero de periode
 * @param int $categorie Numero de categorie : 0=Direction ; 1=Secretariat ; 2=Vie scolaire ; 3=Professeur
 * @return string Date limite de fin de saisie (voir fonction date_periode entre autre)
 */
 Function fin_saisie_reelle ($classe, $numero, $categorie)
  {
   $date_limite = fin_periode ($classe, $numero) ;
   If ($categorie > 0)
    {
     $duree_administration = duree_direction ($classe, $numero) ;
     If ($categorie > 1) { $duree_administration += duree_secretariat ($classe, $numero) ; }
     If ($categorie > 2) { $duree_administration += duree_vie_scolaire ($classe, $numero) ; }
     $table = Explode ("-", SubStr ($date_limite, 0, 10)) ;
     Return (Date ("Y-m-d", MkTime (0, 0, 0, $table [1], (integer)Abs($table [2]-$duree_administration), $table [0]))) ;
    }
   Else
    { Return $date_limite ; }
  }
 
 /**
 * Renvoie le numero de la periode actuelle pour la classe $id_classe
 * @param int $id_classe Id de la classe
 * @return int Numero de periode actuelle
 */
 Function periode_actuelle ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT num_periode FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;
   Return $ligne [0] ;
   /*
   $resultat = SQL_commande ("SELECT debut,fin FROM periodes_classe WHERE classe='".$id_classe."' ORDER BY debut", $id_sql) ;
   $ladate = time () ;
   $p = 0 ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     Do
      {
       $p++ ;
       $ligne = SQL_ligne_suivante ($resultat) ;
       $l0 = Explode ("-", $ligne [0]) ;
       $l1 = Explode ("-", $ligne [1]) ;
      }
     While ((MkTime (0,0,0,$l0 [1],$l0 [2],$l0 [0]) < $ladate) And ($ladate > MkTime (0,0,0,$l1 [1],$l1 [2],$l1 [0])) And ($p < 3)) ;
    }
   Else { $p = 1 ; }
   Return $p ;
   */
  }

 /**
 * Renvoie le numero de la periode valide
 * @param int $id_classe Id de la classe
 * @return int Numero de periode actuelle si existe sinon 0
 */
 Function periode_valide ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT num_periode FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoie l'identifiant de la periode
 * @param int $id_classe Id de la classe
 * @return string Identifiant de la periode actuelle si existe sinon 0
 */
 Function id_periode_par_id_classe ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT periode FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoie le nom de la periode
 * @param int $id_classe Id de la classe
 * @return string Nom de la periode actuelle si existe sinon rien
 */
 Function nom_periode ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT t.nom_periode FROM types_periode t,classes c WHERE t.id_type_periode=c.periode AND c.id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoie le nombre de periodes
 * @param int $id_classe Id de la classe
 * @return string Nombre de periode sinon 0
 */
 Function nombre_periode ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT t.nombre FROM types_periode t, classes c WHERE t.id_type_periode=c.periode AND c.id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoie les caracteristiques de la periode par identifiant du service prof
 * @param int $id_service_prof Id du service prof
 * @return array [0]=Id_classe,[1]=Nombre de periode sinon 0, [2]=Nom periode sinon rien, [3]=Numero de periode courante
 */
 Function carac_periode_par_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT c.id_classe,t.nombre,t.nom_periode,c.num_periode FROM types_periode t,classes c,services_prof s WHERE t.id_type_periode=c.periode AND c.id_classe=s.classe AND s.id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne ;
    }
   Else { Return Array (0,"") ; }
  }
 
 /**
 * Valide la periode $numero de la classe $id_classe pour les professeurs
 * @param int $id_classe Id de la classe
 * @param int $numero Numero de periode a valider
 * @return int -1=Periode non commencee ; 0=Periode passee non valide ; 1=Valide
 */
 Function valide_periode ($id_classe, $numero)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT c.num_periode, p.nombre FROM classes c, types_periode p WHERE c.id_classe='".$id_classe."' AND p.id_type_periode=c.periode LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($resultat) ;

   $table = Explode ("-", SubStr (deb_periode ($id_classe, $numero), 0, 10)) ;
   $date_debut = MkTime (0, 0, 0, (integer)$table [1], (integer)$table [2], (integer)$table [0]) ;

   $date_limite = fin_periode ($id_classe, $numero) ;
   $duree_administration = duree_direction ($id_classe, $numero) + duree_secretariat ($id_classe, $numero) + duree_vie_scolaire ($id_classe, $numero) ;
   $table = Explode ("-", SubStr ($date_limite, 0, 10)) ;
   $date_fin = MkTime (0, 0, 0, (integer)$table [1], (integer)Abs($table [2]-$duree_administration), (integer)$table [0]) ;
   
   $date_courante = MkTime (0, 0, 0, (integer)Date ("m"), (integer)Date ("d"), (integer)Date ("Y")) ;
   If (($date_courante < $date_debut) And ($numero == 1)) { Return "-1" ; }
   ElseIf ($date_courante < $date_debut) { Return "0" ; }
   ElseIf (($date_courante >= $date_debut) And ($date_courante <= $date_fin)) { Return "1" ; } Else { Return "0" ; }
  }

 /**
 * Changement de periode de toutes les classes
 * @return array [0][0]=Nombre,[i][0]=id_classe,[i][1]=(-1:Non commence;0:Pas de changements;1:Changement de periode immediatement;2:Entre deux periodes;3:Fini)
 */
 Function change_periode_classes ()
  {
   Global $id_sql ;

   // Nettoyage
   $ok = SQL_commande ("DELETE FROM calcul_moyenne WHERE periode='0'", $id_sql) ;
   
   $classes = SQL_commande ("SELECT id_classe,num_periode FROM classes WHERE millesime='".millesime (0)."'", $id_sql) ;
   $rapport [0][0] = SQL_nbr_lignes ($classes) ;
   For ($i = 0 ; $i < $rapport [0][0] ; $i++)
    {
     $cl = SQL_tableau_associatif ($classes, "") ;
     // Recherche de la periode existante en fonction de la date
     $periode = SQL_commande ("SELECT numero FROM periodes_classe WHERE classe='".$cl ["id_classe"]."' AND debut<='".Date ("Y-m-d")."' AND fin>='".Date ("Y-m-d")."' ORDER BY numero", $id_sql) ;
     If (SQL_nbr_lignes ($periode) > 0)
      {
       // Trouve donc on met a jour
       $p = SQL_ligne_suivante ($periode) ;
       $ok = SQL_commande ("UPDATE classes SET num_periode='".(integer)$p [0]."' WHERE id_classe='".$cl ["id_classe"]."' LIMIT 1", $id_sql) ;
       If ((integer)$p [0] != $cl ["num_periode"]) { $rapport [$i+1][1] = 1 ; } Else { $rapport [$i+1][1] = 0 ; }
      }
     Else
      {
       // Non trouve donc on recherche ou on est !
       // Recherche du max
       $periode_max = SQL_commande ("SELECT MAX(numero) FROM periodes_classe WHERE classe='".$cl ["id_classe"]."'", $id_sql) ;
       $pm = SQL_ligne_suivante ($periode_max) ;
       // Est-on avant la premiere date : Non commence ?
       $periode = SQL_commande ("SELECT numero FROM periodes_classe WHERE classe='".$cl ["id_classe"]."' AND debut>'".Date ("Y-m-d")."' AND numero='1' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($periode) > 0)
        {
         // Trouve donc on met a jour
         $ok = SQL_commande ("UPDATE classes SET num_periode='1' WHERE id_classe='".$cl ["id_classe"]."' LIMIT 1", $id_sql) ;
	 $rapport [$i+1][1] = -1 ;
        }
       Else
        {
	 // Est-ce fini ?
	 $periode = SQL_commande ("SELECT numero FROM periodes_classe WHERE classe='".$cl ["id_classe"]."' AND fin<'".Date ("Y-m-d")."' AND numero='".$pm [0]."' LIMIT 1", $id_sql) ;
         If (SQL_nbr_lignes ($periode) > 0)
          {
           // Trouve donc on met a jour
           $ok = SQL_commande ("UPDATE classes SET num_periode='".$pm [0]."' WHERE id_classe='".$cl ["id_classe"]."' LIMIT 1", $id_sql) ;
	   $rapport [$i+1][1] = 3 ;
          }
	 Else
	  {
	   // On se trouve entre deux periodes
	   $date_courante = MkTime (0, 0, 0, Date ("m"), Date ("d"), Date ("Y")) ;
	   $periodes = SQL_commande ("SELECT * FROM periodes_classe WHERE classe='".$cl ["id_classe"]."' ORDER BY numero", $id_sql) ;
	   $j = 1 ;
	   $ok_s = 0 ;
	   While (($j <= SQL_nbr_lignes ($periodes)) And ($ok_s == 0))
	    {
	     $periode = SQL_tableau_associatif ($periodes, "") ;
	     $table = Explode ("-", $periode ["debut"]) ; $dd = MkTime (0, 0, 0, $table [1], $table [2], $table [0]) ;
             $table = Explode ("-", $periode ["fin"]) ; $df = MkTime (0, 0, 0, $table [1], $table [2], $table [0]) ;
	     If (($date_courante > $dd) And ($date_courante < $df))
	      {
	       // On est entre deux dates de saisie : Donc periode d'attente
	       $ok = SQL_commande ("UPDATE classes SET num_periode='".$j."' WHERE id_classe='".$cl ["id_classe"]."' LIMIT 1", $id_sql) ;
	       If ($ok) { $ok_s = 1 ; }
	      }
	     $j++ ;
	    }
	   $rapport [$i+1][1] = 2 ;
	  }
	}
      }
    }
   Return $rapport ;
  }

 /**
 * Mise a jour de la periode d'une classe
 * @param int id_classe Numero id de la classe
 */
 Function maj_periode_classe ($id_classe)
  {
   Global $id_sql ;
   // Nettoyage
   $ok = SQL_commande ("DELETE FROM calcul_moyenne WHERE periode='0'", $id_sql) ;

   $date_courante = MkTime (0, 0, 0, Date ("m"), Date ("d"), Date ("Y")) ;
   $classes = SQL_commande ("SELECT c.*, t.nombre FROM classes c, types_periode t WHERE c.id_classe='".$id_classe."' AND c.periode=t.id_type_periode LIMIT 1", $id_sql) ;
   $cl = SQL_tableau_associatif ($classes, "") ;
   // Test de la periode
   $i = 1 ;
   $ok = 0 ;
   While (($i <= $cl ["nombre"]) And ($ok == 0))
    {
     $periodes = SQL_commande ("SELECT * FROM periodes_classe WHERE classe='".$id_classe."' AND numero='".$i."' LIMIT 1", $id_sql) ;
     $p = SQL_tableau_associatif ($periodes, "") ;
     // Calcul des dates debut et fin
     $table = Explode ("-", $p ["debut"]) ;
     $date_debut = MkTime (0, 0, 0, $table [1], $table [2], $table [0]) ;
     $table = Explode ("-", $p ["fin"]) ;
     $date_fin = MkTime (0, 0, 0, $table [1], $table [2], $table [0]) ;
     //echo $date_courante.">=".$date_debut."|".$date_courante."<=".$date_fin."<br>" ;
     If ((($date_courante >= $date_debut) And ($date_courante <= $date_fin)) Or (($i == $cl ["nombre"]) And ($date_courante > $date_fin)))
      {
       // Oui
       $ok = SQL_commande ("UPDATE classes SET num_periode='".$i."' WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
       //$ok = SQL_commande ("UPDATE calcul_moyenne SET ok='0' WHERE periode='".$i."' AND classe='".$id_classe."' LIMIT 1", $id_sql) ;
       $ok = 1 ;
      }
     $i++ ;
    }
   If ($ok == 0)
    {
     $ok = SQL_commande ("SELECT num_periode FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
     $ligne = SQL_ligne_suivante ($ok) ;
     If ($ligne [0] <= 1)
      {
       $fin = SQL_commande ("SELECT fin FROM periodes_classe WHERE classe='".$id_classe."' AND numero='".$cl ["nombre"]."' LIMIT 1", $id_sql) ;
       $p = SQL_ligne_suivante ($fin) ;
       If (Date ("Y-m-d") >= $fin) { $ok = SQL_commande ("UPDATE classes SET num_periode='".$cl ["nombre"]."' WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ; }
       Else { $ok = SQL_commande ("UPDATE classes SET num_periode=1 WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ; }
      }
    }
  }

 // ===============================================================================
 //  GESTION DES ELEVES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi le nom de l'eleve en fonction de son identifiant SQL
 * @param int $id Identifiant de l'eleve
 * @return string Nom de l'eleve
 */
 Function eleveparid ($id)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT nom FROM eleves WHERE id_eleve='".$id."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoi le prenom de l'eleve en fonction de son identifiant SQL
 * @param int $id Identifiant de l'eleve
 * @return string Nom de l'eleve
 */
 Function prenom_eleve_parid ($id)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT prenoms FROM eleves WHERE id_eleve='".$id."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoi le nom et le prenom de l'eleve en fonction de son identifiant SQL
 * @param int $id_eleve Identifiant de l'eleve
 * @param int $mode Mode de sortie (0 : Renvoi brut,  1 : Formattage <N>om <P>renom)
 * @return array [0]=Nom,[1]=Prenom de l'eleve
 */
 Function nom_prenom_eleve_par_id ($id_eleve, $mode)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT nom,prenoms FROM eleves WHERE id_eleve='".$id_eleve."' LIMIT 1", $id_sql) ;
   $table [0] = $table [1] = "" ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     $table [0] = $ligne [0] ;
     $prenom = Explode (" ", $ligne [1]) ;
     $table [1] = $prenom [0] ;
     If ($m == 1)
      {
       $table [0] = StrToUpper (SubStr ($table [0], 0, 1)).StrToLower (SubStr ($table [0], 1, StrLen ($table [0])-1)) ;
       $table [1] = StrToUpper (SubStr ($table [1], 0, 1)).StrToLower (SubStr ($table [1], 1, StrLen ($table [1])-1)) ;
      }
    }
   Return $table ;
  }

 /**
 * Renvoi les options possibles d'une classe en fonction de l'identifiant SQL
 * @param $cl int Identifiant de la classe
 * @return array Options format [id_discipline]="nom court"
 */
 Function options_classe ($cl)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT d.nom_court,s.discipline FROM disciplines d,services_classe s
                               WHERE d.id_discipline=s.discipline AND s.classe='".$cl."' AND s.optionnelle='1' ORDER BY d.nom_court", $id_sql) ;
   While ($ligne = SQL_ligne_suivante ($resultat))
    {
     $options [$ligne [1]] = $ligne [0] ;
    }
   Return $options ;
  }
 
 /**
 * Renvoi les id SQL des service_classe des options possibles d'une classe
 * @param int $cl Identifiant de la classe
 * @return array Options format [id_discipline]=id_service_classe
 */
 Function options_id_classe ($cl)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT s.id_service_classe,s.discipline FROM disciplines d, services_classe s
                               WHERE d.id_discipline=s.discipline AND s.classe='".$cl."' AND s.optionnelle='1' ORDER BY d.nom_court", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     While ($ligne = SQL_ligne_suivante ($resultat))
      {
       $options [$ligne [0]] = $ligne [1] ;
      }
    }
   Else { $options = "" ; }
   Return $options ;
  }

 /**
 * Nom Option en fonction de l'identifiant SQL du service classe
 * @param int $sc Identifiant du service classe
 * @return string Nom court si existe sinon chaine vide
 */
 Function nom_option ($sc)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT d.nom_court FROM disciplines d,services_classe s
                               WHERE d.id_discipline=s.discipline AND s.id_service_classe='".$sc."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return ""  ; }
  }

 /**
 * L'eleve $el suit l'option $op ou pas ?
 * @param int $el Identifiant eleve
 * @param int $op Identifiant discipline
 * @param int $sc Identifiant classe
 * @return int Identifiant de l'option si existe sinon 0
 */
 Function suit_loption ($el, $op, $sc)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$el."' AND discipline='".$op."' AND service_classe='".$sc."' ORDER BY id_option_eleve", $id_sql) ;
   $nombre = SQL_nbr_lignes ($resultat) ;
   If ($nombre == 1)
    {
     // Une seule et unique -> parfait
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   ElseIf ($nombre > 1)
    {
     // Plusieurs options identiques pour le meme eleve, meme classe  ? -> il y en a en trop (on purge)
     $chaine = "" ;
     For ($i = 1 ; $i < $nombre ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       If ($i > 1) { $chaine .= " OR " ; }
       $chaine .= "id_option_eleve='".$ligne [0]."'" ;
      }
     $ok = SQL_commande ("DELETE FROM options_eleve WHERE ".$chaine, $id_sql) ;
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else
    { Return 0 ; }
  }

 /**
 * L'eleve $el a t-il une option identique a l'option $op ou pas ?
 * @param int $el Id eleve
 * @param int $opc Id discipline
 * @return int Nombre d'option eleve si existe sinon 0
 */
 Function option_identique ($el, $op)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$el."' AND discipline='".$op."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   $nombre = SQL_nbr_lignes ($resultat) ;
   Return $nombre ;
  }

 /**
 * Renvoi les groupes possibles d'une classe d'id $cl sinon 0
 * @param int $cl Id classe
 * @return array Tous les groupes possibles
 *  Format : [id discipline][0] : Nom bref
 *           [id discipline][1] : id service classe
 *           [id discipline][2] : Nombre de groupes
 *           pour j allant de 0 a [id discipline][2]
 *            [id discipline][3+j*2] : id groupe classe
 *            [id discipline][4+j*2] : code groupe
 */
 Function groupes_classe ($cl)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT d.nom_bref,s.discipline,s.id_service_classe FROM disciplines d,services_classe s
                               WHERE d.id_discipline=s.discipline AND s.classe='".$cl."' AND s.groupe='1' ORDER BY d.nom_bref,s.id_service_classe", $id_sql) ;
   $nbr_resultats = SQL_nbr_lignes ($resultat) ;
   If ($nbr_resultats > 0)
    {
     For ($i = 0 ; $i < $nbr_resultats ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       $groupes [$ligne [1]][0] = $ligne [0] ;
       $groupes [$ligne [1]][1] = $ligne [2] ;
       $res = SQL_commande ("SELECT * FROM groupes_classe WHERE discipline='".$ligne [1]."' AND classe='".$cl."' ORDER BY code_groupe", $id_sql) ;
       $groupes [$ligne [1]][2] = SQL_nbr_lignes ($res) ;
       For ($j = 0 ; $j < $groupes [$ligne [1]][2] ; $j++)
        {
         $gp = SQL_tableau_associatif ($res, "") ;
         $groupes [$ligne [1]][3+$j*2] = $gp ["id_groupe_classe"] ;
         $groupes [$ligne [1]][4+$j*2] = $gp ["code_groupe"] ;
        }
      }
     Return $groupes ;
    }
   Else { Return 0 ; }
  }

 /**
 * Renvoie l'id du groupe de l'eleve d'id $el pour la discipline d'id $disc
 * @param int $el Id eleve
 * @param int $disc Id discipline
 * @return int Renvoi groupe (>0) si existe, sinon 0
 */
 Function numero_groupe ($el, $disc)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT groupe FROM groupes_eleve WHERE eleve='".$el."' AND discipline='".$disc."' AND millesime='".millesime (0)."'", $id_sql) ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
  }
 
 /**
 * Renvoie tous les id du service classe de la classe $id_classe pour la discipline d'id $id_disc
 * @param int $id_classe Id classe
 * @param int $id_disc Id discipline
 * @return int Renvoi [0]=nbr,[x]=id_service_classe (>0) si existe, sinon [0]=0
 */
 Function ident_service_classe ($id_classe, $id_disc)
  {
   Global $id_sql ;
   $isc [0] = 0 ;
   $resultat = SQL_commande ("SELECT id_service_classe FROM services_classe WHERE classe='".$id_classe."' AND discipline='".$id_disc."'", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     $isc [0] = SQL_nbr_lignes ($resultat) ;
     For ($i = 1 ; $i <= $isc [0] ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       $isc [$i] = $ligne [0] ;
      }
    }
   Else { $isc [0] = 0 ; }
   Return $isc ;
  }

 /**
 * Renvoie tous les id du service prof de la classe $id_classe pour la discipline d'id $id_disc
 * @param int $id_classe Id classe
 * @param int $id_disc Id discipline
 * @param int $id_service_classe Id service classe
 * @return int Renvoi [0][0]=nbr,[x][0]=id_service_prof (>0) si existe,[x][1]=id_ groupe, sinon [0][0]=0
 */
 Function ident_service_prof ($id_classe, $id_disc, $id_service_classe)
  {
   Global $id_sql ;
   $isp [0][0] = 0 ;
   $resultat = SQL_commande ("SELECT id_service_prof,groupe_classe FROM services_prof WHERE discipline='".$id_disc."' AND classe='".$id_classe."' AND service_classe='".$id_service_classe."' AND millesime='".millesime (0)."'", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) > 0)
    {
     $isp [0][0] = SQL_nbr_lignes ($resultat) ;
     For ($i = 1 ; $i <= $isp [0][0] ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       $isp [$i][0] = $ligne [0] ;
       $isp [$i][1] = $ligne [1] ;
      }
    }
   Else { $isp [0][0] = 0 ; }
   Return $isp ;
  }
 
 /**
 * Renvoie l'ID de groupes_eleve de l'eleve d'id $el pour la discipline d'id $disc
 * @param int $el Id eleve
 * @param int $disc Id discipline
 * @return int Renvoi id_groupe_eleve (>0) si existe, sinon 0
 */
 Function id_groupe ($el, $disc)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_groupe_eleve FROM groupes_eleve WHERE eleve='".$el."' AND discipline='".$disc."' AND millesime='".millesime (0)."'", $id_sql) ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
  }

 /**
 * Test si l'eleve suit cette matiere (methode rigoureuse)
 * @param int $id_disc Id discipline
 * @param int $id_classe Id classe
 * @param int $id_sc Id service classe
 * @param int $id_groupe Id groupe
 * @param int $id_eleve Id eleve
 * @return int 1 si OK, 0 sinon
 */
 Function test_matiere ($id_disc, $id_classe, $id_sc, $id_groupe, $id_eleve)
  {
   // Test si la matiere est optionnelle
   $mok = 0 ;
   /*
   If (estoptionnelle ($id_disc, $id_classe, $id_sc) == 0)
    {
     // Pas Option mais en groupe. Appartient au groupe ?
     If ($id_groupe > 0) { If (appartient_au_groupe ($id_eleve, $id_groupe) == 1) { $mok = 1 ; } Else { $mok = 0 ; } }
     Else { $mok = 1 ; }
    }
   Else
    {
     // Sinon est-ce que l'eleve suit l'option ?
     If (suit_loption ($id_eleve, $id_disc, $id_sc) > 0) { $mok = 1 ; }
    }
   */
   If (estoptionnelle ($id_disc, $id_classe, $id_sc) == 0)
    {
     // Discipline obligatoire
     If ($id_groupe > 0)
      {
       // En groupe
       If (appartient_au_groupe ($id_eleve, $id_groupe) == 1)
        {
	 // Fait parti du groupe
	 $mok = 1 ;
	}
       Else
        {
	 // Ne fait pas parti du groupe
	 $mok = 0 ;
	}
      }
     Else
      {
       // Pas de groupe donc ok
       $mok = 1 ;
      }
    }
   Else
    {
     // Discipline optionnelle
     If (suit_loption ($id_eleve, $id_disc, $id_sc) > 0)
      {
       // Suit l'option
       If ($id_groupe > 0)
        {
         If (appartient_au_groupe ($id_eleve, $id_groupe) == 1)
	  {
	   // Suit l'option et fait parti du groupe
	   $mok = 1 ;
	  }
         Else
	  {
	   // Suit l'option et ne fait pas parti du groupe
	   $mok = 0 ;
	  }
        }
       Else
        {
	 // Suit l'option sans groupe
         $mok = 1 ;
        }
      }
     Else
      {
       // Ne suit pas l'option
       $mok = 0 ;
      }
    }
   Return $mok ;
  }
 
 /**
 * Test si l'eleve suit cette discipline (quel que soit l'enseignant)
 * @param int $id_disc Id discipline
 * @param int $id_classe Id classe
 * @param int $id_eleve Id eleve
 * @return array [0]=1 si OK, 0 sinon, [1]=id service classe, [2]=id service prof, [3]=id_groupe
 */
 Function test_discipline ($id_disc, $id_classe, $id_eleve)
  {
   // Test si la matiere est optionnelle
   $mok [0] = 0 ;
   $id_sc = ident_service_classe ($id_classe, $id_disc) ;
   $num = 1 ;
   $ok = 0 ;
   While (($num <= $id_sc [0]) And ($ok == 0))
    {
     If (estoptionnelle ($id_disc, $id_classe, $id_sc [$num]) == 0)
      {
       // Discipline obligatoire
       $isp = ident_service_prof ($id_classe, $id_disc, $id_sc [$num]) ;
       If ($isp [0][0] == 1)
        {
	 If ($isp [1][1] > 0)
	  {
	   If (appartient_au_groupe ($id_eleve, $isp [1][1]) == 1) { $gp_ok = 1 ; } Else { $gp_ok = 0 ; }
	  }
	 Else { $gp_ok = 1 ; }
	 If ($gp_ok == 1)
	  {
	   $mok [0] = 1 ;
	   $mok [1] = $id_sc [$num] ;
	   $mok [2] = $isp [1][0] ;
	   $mok [3] = $isp [1][1] ;
	   $ok = 1 ;
	  }
	}
      }
     ElseIf (estoptionnelle ($id_disc, $id_classe, $id_sc [$num]) > 0)
      {
       // Discipline optionnelle ?
       If (suit_loption ($id_eleve, $id_disc, $id_sc [$num]) > 0)
        {
         // Suit l'option
	 $isp = ident_service_prof ($id_classe, $id_disc, $id_sc [$num]) ;
         If ($isp [0][0] == 1)
          {
	   If ($isp [1][1] > 0)
	    {
	     If (appartient_au_groupe ($id_eleve, $isp [1][1]) == 1) { $gp_ok = 1 ; } Else { $gp_ok = 0 ; }
	    }
	   Else { $gp_ok = 1 ; }
	   If ($gp_ok == 1)
	    {
	     $mok [0] = 1 ;
	     $mok [1] = $id_sc [$num] ;
	     $mok [2] = $isp [1][0] ;
	     $mok [3] = $isp [1][1] ;
	     $ok = 1 ;
	    }
	  }
        }
      }
     $num++ ;
    }
   Return $mok ;
  }

 // ===============================================================================
 //  GESTION DES UTILISATEURS
 // -------------------------------------------------------------------------------

 /**
 * Renvoie le numero de l'utilisateur enregistre dans la session
 * @param string $code Code de session courante
 * @return int Identifiant de l'utilisateur
 */
 Function utilparcode ($code)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT utilisateur FROM sessions WHERE id_session='".$code."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return ($ligne [0]) ;
    }
   Else { Return 0 ; }
  }

 /**
 * Renvoie le nom de l'utilisateur d'ID $id
 * @param int $id Id de l'utilisateur
 * @return string Nom de l'utilisateur
 */
 Function utilparid ($id)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT nom FROM utilisateurs WHERE id_utilisateur='".$id."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     If ($ligne) { Return $ligne [0] ; }
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoie l'identifiant du prof par rapport a l'identifiant du service prof
 * @param int $id_service_prof Identifiant du service prof
 * @return int Iderntifiant du prof si existe sinon 0
 */
 Function id_prof_par_id_service_prof ($id_service_prof)
  {
   Global $id_sql ;
   $id = 0 ;
   $resultat = SQL_commande ("SELECT professeur FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     If ($ligne [0] > 0) { $id = $ligne [0] ; } Else { $id = alias_enseignant_principal (-$ligne [0]) ; }
    }
   Return $id ;
  }

 /**
 * Renvoi l'ID de l'utilisateur en fonction de l'identifiant et du mot de passe
 * @param string $ident Identifiant
 * @param string $passe Mot de passe
 * @return int Identifiant de l'utilisateur si existe sinon 0
 */
 Function utilparpasse ($ident, $passe)
  {
   Global $id_sql, $droit_supervision, $droit_admin, $droit_direction, $droit_secretariat ;
   If (($ident == '') Or ($passe == '')) { Return 0 ; }
   $ident = AddSlashes ($ident) ;
   $passe = AddSlashes ($passe) ;
   $millesime = millesime (0) ;
   $resultat = SQL_commande ("SELECT id_utilisateur FROM utilisateurs WHERE login='".$ident."' AND passe='".$passe."'
                                 AND (millesime='".$millesime."' OR (millesime!='".$millesime."' AND (droits='".$droit_supervision."' OR droits='".$droit_admin."' OR droits='".$droit_direction."' OR droits='".$droit_secretariat."'))) LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return 0 ; }
  }

 // ===============================================================================
 //  GESTION DES THEMES
 // -------------------------------------------------------------------------------

 /**
 * Renvoi le numero de theme de l'utilisateur en fonction de l'identifiant et du mot de passe
 * @param string $ident Identifiant
 * @param string $passe Mot de passe
 * @return int Numero du theme si existe sinon 1 (theme par defaut)
 */
 Function themeparpasse ($ident, $passe)
  {
   Global $id_sql ;
   If (($ident == '') Or ($passe == '')) { Return 0 ; }
   $ident = AddSlashes ($ident) ;
   $passe = AddSlashes ($passe) ;
   $resultat = SQL_commande ("SELECT u.theme FROM utilisateurs u,themes t
                               WHERE u.login='".$ident."' AND u.passe='".$passe."' AND t.id_theme=u.theme AND t.validation='1' AND u.millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_tableau_associatif ($resultat, "") ;
     If ($ligne) { Return $ligne ["theme"] ; }
     Else { Return "1" ; }
    }
   Else { Return "1" ; }
  }

 /**
 * Renvoi le numero du theme d'un utilisateur possedant une session
 * @param int $s Identifiant de session
 * @return int Numero du theme si existe sinon 1 (theme par defaut)
 */
 Function themeparsession ($s)
  {
   Global $id_sql ;
   //valide_delais () ;
   $resultat = SQL_commande ("SELECT theme FROM sessions WHERE id_session='".$s."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_tableau_associatif ($resultat, "") ;
     Return $ligne ["theme"] ;
    }
   Else
    { Return 1 ; }
  }

 /**
 * Inclut le theme numero $n
 * @param string $n Identifiant du theme utilise
 * @return array Contient [id_theme], [nom], [nom_repertoire], [fichier_config] et [validation]
 */
 Function parametres_theme ($n)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT * FROM themes WHERE id_theme='".$n."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_tableau_associatif ($resultat, "") ;
     //Include ("./themes/".$ligne ["nom_repertoire"]."/".$ligne ["fichier_config"]) ;
     Return $ligne ;
    }
   Else
    {
     $ligne ["id_theme"] = 1 ;
     $ligne ["nom"] = "Plastique" ;
     $ligne ["nom_repertoire"] = "plastique" ;
     $ligne ["fichier_config"] = "config.inc" ;
     $ligne ["validation"] = 1 ;
     Return $ligne ;
    }
  }

 // ===============================================================================
 //  GESTION DES UTILISATEURS
 // -------------------------------------------------------------------------------

 /**
 * Renvoie le nom et la civilite de l'utilisateur enregistre dans la session $c
 * @param int $c Code session identifiant l'utilisateur
 * @param int $m Mode de sortie (0 : Renvoi brut,  1 : Formattage <civilite> <N>om)
 * @return string Nom de l'utilisateur
 */
 Function nom_utilparsession ($c, $m)
  {
   Global $civilites, $id_sql ;
   $resultat = SQL_commande ("SELECT civilite,nom FROM utilisateurs WHERE id_utilisateur='".utilparcode ($c)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $civilites [(integer)$ligne [0]]." ".$ligne [1] ;
    }
   Else { Return "" ; }
  }

 /**
 * Renvoie le prenom de l'utilisateur enregistre dans la session $c
 * @param int $c Code session identifiant l'utilisateur
 * @return string Prenom de l'utilisateur
 */
 Function prenom_utilparsession ($c)
  {
   Global $civilites, $id_sql ;
   $resultat = SQL_commande ("SELECT prenom FROM utilisateurs WHERE id_utilisateur='".utilparcode ($c)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return "" ; }
  }

 /**
 * Renvoie le nom et la civilite de l'utilisateur enregistre
 * @param int $id Identifiant utilisateur
 * @param int $m Mode de sortie (0 : Renvoi brut,  1 : Formattage <civilite> <N>om)
 * @return string Nom de l'utilisateur
 */
 Function nom_utilparid ($id, $m)
  {
   Global $civilites, $id_sql ;
   If ($id > 0) { $resultat = SQL_commande ("SELECT civilite,nom FROM utilisateurs WHERE id_utilisateur='".$id."' LIMIT 1", $id_sql) ; }
   Else
    {
     // Alias -> Recherche le premier
     $resultat = SQL_commande ("SELECT u.civilite,u.nom FROM groupes_alias g,utilisateurs u WHERE g.id_alias='".(-$id)."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
    }
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     $ligne [1] = $ligne [1] ;
     If ($m == 0) { Return $civilites [(integer)$ligne [0]]." ".$ligne [1] ; }
     Else { Return $civilites [(integer)$ligne [0]]." ".StrToUpper (SubStr ($ligne [1], 0, 1)).StrToLower (SubStr ($ligne [1], 1, StrLen ($ligne [1])-1)) ; }
    }
   Else { Return "" ; }
  }

 /**
 * Renvoie le prenom de l'utilisateur enregistre
 * @param int $id Identifiant utilisateur
 * @return string Prenom de l'utilisateur
 */
 Function prenom_utilparid ($id)
  {
   Global $civilites, $id_sql ;
   $resultat = SQL_commande ("SELECT prenom FROM utilisateurs WHERE id_utilisateur='".$id."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne [0] ;
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoie le nom et le prenom de l'utilisateur enregistre
 * @param int $id Identifiant utilisateur (<0=Alias donc renvoi l'enseignant principal)
 * @param int $mf Mode de sortie (0=NOM/1=Nom/2=<b>NOM</b>/3=<b>Nom</b>/4=<i>NOM</i>/5=<i>Nom</i>/6=<b><i>NOM</i></b>/7=<b><i>Nom</i></b>)
 * @param int $mp Type de formattage du prenom (voir mf pour les modes)
 * @param int $sortie Mode de sortie (0=HTML/1=texte)
 * @return string Nom de l'utilisateur sinon ? si non trouve
 */
 Function nom_prenom_utilparid ($id, $mf, $mp, $sortie)
  {
   Global $civilites, $id_sql ;
   If ($id > 0) { $resultat = SQL_commande ("SELECT nom,prenom FROM utilisateurs WHERE id_utilisateur='".$id."' LIMIT 1", $id_sql) ; }
   Else
    {
     // Alias -> Recherche le premier
     $resultat = SQL_commande ("SELECT u.nom,u.prenom FROM groupes_alias g,utilisateurs u WHERE g.id_alias='".(-$id)."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
    }
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     If ($sortie > 0)
      {
       $nom = $ligne [0] ;
       $prenom = $ligne [1] ;
      }
     Else
      {
       $nom = $ligne [0] ;
       $prenom = $ligne [1] ;
      }
     Return formatte_nom_eleve ($nom, $prenom, $mf, $mp, $sortie) ;
     //Return $ba1.$nom.$bp1.$espace.$ba2.$prenom.$bp2 ;
    }
   Else { Return "?" ; }
  }
 
 /**
 * Renvoie le nom et la civilite de l'utilisateur enregistre
 * @param int $id_service_prof Identifiant utilisateur
 * @param int $m Mode de sortie (0:Renvoi brut, 1:<civilite> <N>om <P>renom, 2:<civilite> <P>renom <N>om,3:<civilite> <N>om)
 * @return string Nom de l'utilisateur
 */
 Function nom_prenom_utilparservice_prof ($id_service_prof, $m)
  {
   Global $civilites, $id_sql ;
   $chaine = "" ;
   If ($id_service_prof > 0)
    {
     $resultat = SQL_commande ("SELECT professeur FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       If ($ligne [0] < 0)
        {
         // Alias -> Recherche le premier
         $resultat = SQL_commande ("SELECT u.civilite,u.nom,u.prenom FROM groupes_alias g,utilisateurs u WHERE g.id_alias='".(-$ligne [0])."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
	 $chaine = "&Eacute;quipe de " ;
	}
       Else { $resultat = SQL_commande ("SELECT civilite,nom,prenom FROM utilisateurs WHERE id_utilisateur=".$ligne [0]." LIMIT 1", $id_sql) ; }
       If (SQL_nbr_lignes ($resultat) == 1)
        {
         $ligne = SQL_ligne_suivante ($resultat) ;
	 $nom = StrToUpper (SubStr ($ligne [1], 0, 1)).StrToLower (SubStr ($ligne [1], 1, StrLen ($ligne [1])-1)) ;
	 $prenom = StrToUpper (SubStr ($ligne [2], 0, 1)).StrToLower (SubStr ($ligne [2], 1, StrLen ($ligne [2])-1)) ;
	 Switch ($m)
	  {
	   Default :
	   Case 0 : $chaine .= $civilites [(integer)$ligne [0]]." ".$ligne [1]." ".$ligne [2] ; Break ;
	   Case 1 : $chaine .= $civilites [(integer)$ligne [0]]." ".$nom." ".$prenom ; Break ;
	   Case 2 : $chaine .= $civilites [(integer)$ligne [0]]." ".$prenom." ".$nom ; Break ;
	   Case 3 : $chaine .= $civilites [(integer)$ligne [0]]." ".$nom ; Break ;
	  }
	}
       Else
        {
	 $chaine = "Aucun enseignant." ;
	}
      }
    }
   Else
    {
     $chaine = "Aucun enseignant." ;
    }
   Return $chaine ;
  }
 
 /**
 * Renvoi les caracteristiques d'un utilisateur
 * @param int $id_utilisateur Identifiant de l'utilisateur
 * @return array Tableau contenant : [0]=Id enseignant
 *                                   [1]=Civilite
 *                                   [2]=Nom
 *                                   [3]=Prenom
 */
 Function caracteristiques_utilisateur ($id_utilisateur)
  {
   Global $id_sql ;
   If ($id_utilisateur > 0)
    {
     // Utilisateur direct
     $resultats = SQL_commande ("SELECT id_utilisateur,civilite,nom,prenom FROM utilisateurs WHERE id_utilisateur='".$id_utilisateur."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultats) == 1)
      {
       $l = SQL_ligne_suivante ($resultats) ;
       $table [0] = $l [0] ;
       $table [1] = $l [1] ;
       $table [2] = $l [2] ;
       $table [3] = $l [3] ;
      }
     Else { $table [0] = $table [1] = $table [2] = $table [3] = "" ; }
    }
   ElseIf ($id_utilisateur < 0)
    {
     // Alias
     $table = alias_enseignant_principal ($id_utilisateur) ;
    }
   Else { $table [0] = $table [1] = $table [2] = $table [3] = "" ; }
   Return $table ;
  }

 /**
 * Renvoie les disciplines enseignees si c'est un prof
 * @param int $id_prof Identifiant enseignant
 * @return string Nom des disciplines separees par "- " (D1 - D2 - ...)
 */
 Function disciplines_prof ($id_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT d.nom FROM disciplines d, services_prof s WHERE s.discipline=d.id_discipline AND s.professeur='".$id_prof."' GROUP BY d.nom", $id_sql) ;
   $retour = "" ;
   While ($ligne = SQL_ligne_suivante ($resultat))
    {
     $ligne [0] = $ligne [0] ;
     If ($retour <> "") { $retour .= "- ".$ligne[0]." " ; } Else  { $retour .= $ligne[0]." " ; }
    }
   Return $retour ;
  }

 // ===============================================================================
 //  GESTION DES SESSIONS
 // -------------------------------------------------------------------------------
 /**
 * Envoi les commandes de sortie en javascript
 * @param $fen int Indication d'une fenetre popup ou pas (1/0)
 * @param $err int Numero d'erreur de sortie
 */
 Function sortie_javascript ($fen, $err)
  {
   Global $page_sortie ;
   Echo "<html><head><script> " ;
   If ($fen == 1)
    {
     Echo "window.open (\"".$page_sortie."?erreur=".$err."\", \"_parent\", \"\");" ;
     Echo "window.close()" ;
    }
   Else { Echo "window.open (\"".$page_sortie."?erreur=".$err."\", \"_top\", \"\")" ; }
   Echo " </script></head></html>" ;
   Exit ;
  }

 /**
 * Validation du delais d'utilisation directement dans la bdd SQL
 * @return int -1=Session sauvegardee ; 0=Plus de session ; >0=Session encore active (droit)
 */
 Function valide_delais ($code)
  {
   Global $id_sql, $droit_courant ;
   $maintenant = Time () ;
   $res = SQL_commande ("SELECT actif FROM sessions WHERE id_session='".$code."' LIMIT 1", $id_sql) ;
   $r_ok = SQL_ligne_suivante ($res) ;
   // Purge
   $ok = SQL_commande ("DELETE FROM sessions WHERE actif='0'", $id_sql) ;
   // Desactive en vue d'une sauvegarde des donnees de session en cours
   $ok = SQL_commande ("UPDATE sessions SET actif='0' WHERE (dateheure+duree_session)<'".$maintenant."'", $id_sql) ;
   // Verification session
   $requete ="SELECT id_session,dateheure,dh_maj,inactivite,duree_session,actif FROM sessions WHERE id_session='".$code."'" ;
   If (IsSet ($droit_courant)) { $requete .= " AND droits='".$droit_courant."'" ; }
   $resultat = SQL_commande ($requete." LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_tableau_associatif ($resultat, "") ;
     If ($ligne ["actif"] == 1)
      {
       $duree_connexion = $maintenant - $ligne ["dateheure"] ;
       If ($duree_connexion > $ligne ["duree_session"])
        {
         $ok = SQL_commande ("DELETE FROM sessions WHERE id_session='".$ligne ["id_session"]."' LIMIT 1", $id_sql) ;
         Return 0 ; // Plus de connexion
        }
       Else
        {
         If ($maintenant - $ligne ["dh_maj"] > $ligne ["inactivite"])
          {
           $ok = SQL_commande ("DELETE FROM sessions WHERE id_session='".$ligne ["id_session"]."' LIMIT 1", $id_sql) ;
 	   Return 0 ; // Plus de connexion
          }
         Else
          {
           $ok = SQL_commande ("UPDATE sessions SET dh_maj='".$maintenant."' WHERE id_session='".$ligne ["id_session"]."' LIMIT 1", $id_sql) ;
	   Return $droit_courant ;
	  }
	}
      }
     Else
      {
       // La session va prendre fin des le prochain test
       Return $droit_courant ;
      }
    }
   Else
    {
     If ($r_ok [0] == 0) { Return -1 ; } Else { Return 0 ; }
    }
  }

 /**
 * Calcul du temps restant
 * @return int Duree de la session courante restante moins le minimum ou minimum restant
 */
 Function calcul_delais ()
  {
   Global $id_sql, $droit_courant, $duree_session_minimum, $_SESSION ;
   $code = $_SESSION ["code"] ;
   $maintenant = Time () ;
   $resultat = SQL_commande ("SELECT dateheure,dh_maj,inactivite,duree_session FROM sessions WHERE id_session='".$code."' AND droits='".$droit_courant."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat, "") ;
     $duree_connexion = $maintenant - $ligne [0] ;
     $duree_inactivite = $maintenant - $ligne [1] ;
     If ($duree_connexion > $ligne [3])
      {
       // Plus de connexion
       Return 0 ;
      }
     ElseIf ($duree_inactivite > $ligne [2])
      {
       // Plus de connexion
       Return 0 ;
      }
     Else
      {
       $reste = $ligne [3]-$duree_connexion ;
       If ($reste < 0) { Return 0 ; } Else { Return $reste ; }
      }
    }
   Else
    {
     // Plus de connexion
     Return 0 ;
    }
  }

 /**
 * Renvoi la date de debut, la date de MAJ, l'inactivite et la duree de la session
 * @return array Format :[0]=Date Debut, [1]=Date MAJ, [2]=Inactivite, [3]=Duree Session Si Existe sinon 0
 */
 Function renseignements_session ()
  {
   Global $id_sql, $droit_courant, $_SESSION ;
   $code = $_SESSION ["code"] ;
   $resultat = SQL_commande ("SELECT dateheure,dh_maj,inactivite,duree_session FROM sessions WHERE id_session='".$code."' AND droits='".$droit_courant."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { $r = SQL_ligne_suivante ($resultat) ; } Else { $r [0] = $r [1] = $r [2] = $r [3] = 0 ; }
   Return $r ;
  }

 /**
 * Verification des droits
 * @param $droit int Droit courant
 * @param $id_session int Identifiant de session
 * @return int Droit
 */
 Function verif_droits ($droit, $id_session)
  {
   Global $id_sql, $fenetre, $page_sortie ;
   $vd = valide_delais ($id_session) ;
   If ($vd <= 0)
    {
     sortie_javascript ($fenetre, 1-$vd*4) ;
     Exit ;
    }
   Else
    {
     $resultat = SQL_commande ("SELECT droits FROM sessions WHERE id_session='".$id_session."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 0)
      {
       sortie_javascript ($fenetre, 1) ;
       Exit ;
      }
     Else
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       If ($ligne [0] == $droit) { Return $droit ; }
       Else
        {
         sortie_javascript ($fenetre, 4) ;
         Exit ;
	}
      }
    }
  }

 /**
 * Renvoi les droits d'un utilisateur possedant une session
 * @param $id_session int Identifiant de session
 * @return int Droit
 */
 Function droitsparsession ($id_session)
  {
   Global $id_sql, $fenetre, $page_sortie ;
   valide_delais ($id_session) ;
   $resultat = SQL_commande ("SELECT droits FROM sessions WHERE id_session='".$id_session."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_tableau_associatif ($resultat, "") ;
     Return $ligne ["droits"] ;
    }
   Else
    {
     //Header ("Location: ".$page_sortie) ;
     sortie_javascript ($fenetre, 4) ;
     Exit ;
    }
  }

 /**
 * Determine les temps de session et d'inactivite
 * @param int $droit Droit a tester
 * @param array Tableau contenant la duree de session [0] et la duree d'inactivite [1]
 */
 Function determine_durees ($droit)
  {
   Global $troptard, $inactivite, $droit_supervision, $droit_admin, $droit_direction, $droit_secretariat, $droit_cpe, $droit_surveillant, $droit_prof, $droit_trombinoscope, $droit_eleve ;
   $t [0] = $t [1] = 0 ;
   If (IsSet ($troptard))
    {
     Switch ($droit)
      {
       Case $droit_supervision   : $t [0] = $troptard [$droit_supervision] ;   $t [1] = $inactivite [$droit_supervision] ; Break ;
       Case $droit_admin         : $t [0] = $troptard [$droit_admin] ;         $t [1] = $inactivite [$droit_admin] ; Break ;
       Case $droit_direction     : $t [0] = $troptard [$droit_direction] ;     $t [1] = $inactivite [$droit_direction] ; Break ;
       Case $droit_secretariat   : $t [0] = $troptard [$droit_secretariat] ;   $t [1] = $inactivite [$droit_secretariat] ; Break ;
       Case $droit_cpe           : $t [0] = $troptard [$droit_cpe] ;           $t [1] = $inactivite [$droit_cpe] ; Break ;
       Case $droit_surveillant   : $t [0] = $troptard [$droit_surveillant] ;   $t [1] = $inactivite [$droit_surveillant] ; Break ;
       Case $droit_prof          : $t [0] = $troptard [$droit_prof] ;          $t [1] = $inactivite [$droit_prof] ; Break ;
       Case $droit_trombinoscope : $t [0] = $troptard [$droit_trombinoscope] ; $t [1] = $inactivite [$droit_trombinoscope] ; Break ;
       Case $droit_eleve         : $t [0] = $troptard [$droit_eleve] ;         $t [1] = $inactivite [$droit_eleve] ; Break ;
       Default                   : $t [0] = 600 ;                              $t [1] = 120 ; Break ;
      }
    }
   Else
    {
     Global $troptard_admin, $trop_prof ;
     Switch ($droit)
      {
       Case $droit_supervision   : $t [0] = $troptard_admin ; $t [1] = $inactivite ; Break ;
       Case $droit_admin         : $t [0] = $troptard_admin ; $t [1] = $inactivite ; Break ;
       Case $droit_direction     : $t [0] = $troptard_admin ; $t [1] = $inactivite ; Break ;
       Case $droit_secretariat   : $t [0] = $troptard_admin ; $t [1] = $inactivite ; Break ;
       Case $droit_cpe           : $t [0] = $troptard_prof ; $t [1] = $inactivite ; Break ;
       Case $droit_surveillant   : $t [0] = $troptard_prof ; $t [1] = $inactivite ; Break ;
       Case $droit_prof          : $t [0] = $troptard_prof ; $t [1] = $inactivite ; Break ;
       Case $droit_trombinoscope : $t [0] = $troptard_prof ; $t [1] = $inactivite ; Break ;
       Case $droit_eleve         : $t [0] = $troptard_prof ; $t [1] = $inactivite ; Break ;
       Default                   : $t [0] = 600 ; $t [1] = 120 ; Break ;
      }
    }
   If ($t [0] == 0) { $t [0] = 600 ; }
   If ($t [1] == 0) { $t [1] = 120 ; }
   Return $t ;
  }

 /**
 * Initialisation de la session
 * @param int $droits Droit courant
 * @param string $ident Identifiant
 * @param string $passe Mot de passe
 * @return int Identifiant de session ou 0 (Pas de session)
 */
 Function init_session ($droits, $ident, $passe)
  {
   Global $auth_mode, $id_sql, $note_par_defaut, $_SERVER, $droit_eleve, $droit_cahier_textes, $cahier_textes_id ;
   $ip_client = adresse_ip () ;
   $millesime = millesime (0) ;
   //If (($auth_mode == 1) Or ($auth_mode == 4))
    //{
     // Authentification interne
     If ($droits == $droit_eleve)
      {
       $eleve = SQL_commande ("SELECT id_eleve,theme FROM eleves WHERE login='".$ident."' AND passe='".$passe."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
       $el = SQL_tableau_associatif ($eleve, "") ;
       $util  = $el ["id_eleve"] ;
       $t = $el ["theme"] ;
      }
     ElseIf (($droits == $droit_cahier_textes) And ($cahier_textes_id != 0))
      {
       If ($cahier_textes_id < 0) { $util = -$cahier_textes_id ; } Else { $util  = $cahier_textes_id ; }
       $t = 1 ;
      }
     Else
      {
       $util = utilparpasse ($ident, $passe) ;
       $t = themeparpasse ($ident, $passe) ;
      } 
     If ($util  > 0)
      {
       $dh = Time () ;
       $date_init = Date ("Y-m-d H:i:s") ;
       // -- Partie a changer pour une configuration via SQL
       $durees = determine_durees ($droits) ;
       //If ($droits < $droit_cpe) { $tt = $troptard_prof ; } Else { $tt = $troptard_admin ; }
       //$inactif = $inactivite ;
       // --
       $ok = SQL_commande ("INSERT INTO sessions (droits,utilisateur,dateheure,dh_maj,date,description,coefficient,theme,examen,max,ip,inactivite,duree_session,actif)
                            VALUES ('".$droits."','".$util."',".$dh.",".$dh.",'".$date_init."','','1','".$t."','0','".$note_par_defaut."','".$ip_client."','".$durees [1]."','".$durees [0]."','1')", $id_sql) ;
       $resultat = SQL_commande ("SELECT id_session FROM sessions WHERE droits='".$droits."' AND utilisateur='".$util."' AND dateheure='".$dh."' AND dh_maj='".$dh."' AND date='".$date_init."' AND ip='".$ip_client."' AND inactivite='".$durees [1]."' AND duree_session='".$durees [0]."' AND actif='1' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($resultat) == 1)
        {
         $ligne = SQL_ligne_suivante ($resultat) ;
         Return $ligne [0] ;
        }
       Else { Return "0" ; }
      }
     Else { Return "0" ; }
    //}
   //ElseIf ($auth_mode == 2)
    //{
     // Authentification MySQL
     //Return "0" ;
    //}
   //ElseIf ($auth_mode == 3)
    //{
     // Authentification LDAP
     //Return "0" ;
    //}
  }

 /**
 * Suite de la session en cours
 * @param $code int Identifiant session
 * @param $droit int Droit courant
 */
 Function suite_session ($code, $droit)
  {
   Global $page_sortie ;
   $ok = SQL_connexion ($hote, $qui, $passe_sql, $bdd) ;
   $d = droitsparsession ($code) ;
   If ($d != $droit) { Header ("Location: ".$page_sortie) ; }
  }

 // ===============================================================================
 //  GESTION DES CONTROLES
 // ------------------------------------------------------------------------------- 
 /**
 * Renvoie une liste des controles pour une classe et une discipline (A TERMINER)
 * @param int $classe Identifiant SQL de la classe
 * @param int $periode Numero de la periode
 * @param int $disciplines Identifiant SQL de la discipline
 * @return string Nom de l'utilisateur
 */
 Function controles ($classe, $periode, $disciplines)
  {
   Global $id_sql ;
   // Calcul des limites de la periode
   Switch ($periode)
    {
     Case 1 : $ddebut = '1970-01-01' ;
              $dfin = deb_tr ($classe, 2) ;
              Break ;
     Case 2 : $ddebut = deb_tr ($classe, 2) ;
              $dfin = deb_tr ($classe, 3) ;
              Break ;
     Case 3 : $debut = deb_tr ($classe, 3) ;
              $dfin = '9999-31-12' ;
              Break ;
    }
   $resultat = SQL_commande ("SELECT c.id_controle FROM controles c, classes cl WHERE c.id_classe='".$classe."' AND c.date", $id_sql) ;
  }

 /*
 * (A TERMINER)
 */
 Function classe_controle ($id)
  {
   $resultat = SQL_commande ("SELECT id_classe FROM classes cl, controles ctr WHERE ctr.controle='".$id."' and cl.id_classe=ctr.classe AND cl.millesime='".millesime (0)."'") ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; }
   Else { Return False ; }
  }

 // ===============================================================================
 //  GESTION DES TYPES
 // -------------------------------------------------------------------------------
 /**
 * Renvoi le nom du type de discipline
 * @param int $id Identifiant de reperage de la discipline
 * @return string Nom du type
 */
 Function nom_type_discipline ($id)
  {
   Global $types_disciplines ;
   $nom = "" ;
   For ($i = 1 ; $i <= $types_disciplines [0][0] ; $i++)
    {
     If ($types_disciplines [$i][1] == $id) { $nom = $types_disciplines [$i][0] ; }
    }
   Return $nom ;
  }
 
 /**
 * Renvoi le nom du type de moyenne
 * @param int $id Identifiant de reperage de la moyenne
 * @return string Nom du type
 */
 Function nom_type_moyenne ($id)
  {
   Global $types_moyennes ;
   $nom = "" ;
   For ($i = 1 ; $i <= $types_moyennes [0][0] ; $i++)
    {
     If ($types_moyennes [$i][1] == $id) { $nom = $types_moyennes [$i][0] ; }
    }
   Return $nom ;
  }
 
 // ===============================================================================
 //  GESTION DES NOTES
 // -------------------------------------------------------------------------------
 /**
 * Creation d'un tableau de pre-enregistrement des moyennes a sauvegarder
 * @param array $tableau Table contenant les differentes moyennes
 * @param int $id_eleve Identifiant eleve ou classe
 * @param int $id_controle Identifiant controle (0=Moyenne discipline ...)
 * @param int $id_sc Identifiant service classe
 * @param int $id_sp Identifiant service prof
 * @param int $periode Periode
 * @param string $valeur Valeur de la note
 * @param int $type Type de note (voir constantes)
 * @param int $millesime Millesime
 * @return array Tableau rempli 
 */
 Function creation_table_moyenne ($tableau,$id_eleve,$id_controle,$id_sc,$id_sp,$periode,$valeur,$type,$millesime)
  {
   If (!Is_Numeric ($tableau [0][0])) { $tableau [0][0] = 0 ; }
   $tableau [0][0]++ ;
   $indice = $tableau [0][0] ;
   $tableau [$indice][0] = $id_eleve ;
   $tableau [$indice][1] = $id_controle ;
   $tableau [$indice][2] = $id_sc ;
   $tableau [$indice][3] = $id_sp ;
   $tableau [$indice][4] = $periode ;
   $tableau [$indice][5] = $valeur ;
   $tableau [$indice][6] = $type ;
   $tableau [$indice][7] = 0 ;
   Return $tableau ;
  }
 
 /**
 * Sauvegarde de la table des moyennes
 * @param array $tableau Table contenant les differentes moyennes
 * @param int $id_classe Identifiant de la classe
 * @param int $id_sc Identifiant service classe
 * @param int $id_sp Identifiant service prof
 * @param int $periode Periode
 * @param int $millesime Millesime
 * @return int 0=Non Ok, 1=Ok 
 */
 Function sauvegarde_table_moyenne ($tableau,$id_classe,$id_sc,$id_sp,$periode,$millesime)
  {
   Global $id_sql ;
   If ($tableau [0][0] > 0)
    {
     $date_maj = Date ("Y-m-d H:i:s") ;
     $existants [0][0] = 0 ;
     $existe = SQL_commande ("SELECT id_moyenne,eleve,controle,valeur,type FROM moyennes WHERE periode='".$periode."' AND service_prof='".$id_sp."' AND service_classe='".$id_sc."' AND millesime='".$millesime."'", $id_sql) ;
     $nbr_existe = SQL_nbr_lignes ($existe) ;
     For ($i = 1 ; $i <= $nbr_existe ; $i++)
      {
       $ligne = SQL_ligne_suivante ($existe) ;
       $existants [0][0]++ ;
       $existants [$existants [0][0]][0] = $ligne [0] ;
       $existants [$existants [0][0]][1] = 0 ;
       $ok_maj = 0 ;
       $j = 1 ;
       While (($ok_maj == 0) And ($j <= $tableau [0][0]))
        {
         If (($ligne [1] == $tableau [$j][0]) And ($ligne [2] == $tableau [$j][1]) And ($ligne [4] == $tableau [$j][6])) { $ok_maj = $j ; }
         $j++ ;
        }
       If ($ok_maj > 0)
        {
	 If (Abs ($tableau [$ok_maj][5]-$ligne [3])>0.00000001)
	  {
 	   $ok = SQL_commande ("UPDATE moyennes SET valeur='".$tableau [$ok_maj][5]."',date_maj='".$date_maj."' WHERE id_moyenne='".$ligne [0]."' LIMIT 1", $id_sql) ;
	  }
 	 $existants [$existants [0][0]][1] = 1 ;
         $tableau [$ok_maj][7] = 1 ;
        }
      }
     // Destruction
     /*
     $des_ok = 0 ;
     $requete_des = "" ;
     For ($i = 1 ; $i <= $existants [0][0] ; $i++)
      {
       If ($existants [$i][1] == 0)
        {
         If ($des_ok == 1) { $requete_des .= " OR " ; }
         $requete_des .= "id_moyenne='".$existants [$i][0]."'" ;
         $des_ok = 1 ;
        }
      }
     If ($des_ok == 1) { $ok = SQL_commande ("DELETE FROM moyennes WHERE ".$requete_des, $id_sql) ; }
     */
     // Insertion
     $ins_ok = 0 ;
     $requete_ins = "" ;
     For ($i = 1 ; $i <= $tableau [0][0] ; $i++)
      {
       If ($tableau [$i][7] == 0)
        {
	 If ($ins_ok == 1) { $requete_ins .= "," ; }
         $requete_ins .= "('".$tableau [$i][0]."','".$tableau [$i][1]."','".$tableau [$i][2]."','".$tableau [$i][3]."','".$tableau [$i][4]."','".$tableau [$i][5]."','".$tableau [$i][6]."','".$date_maj."','".$date_maj."','".$millesime."')" ;
	 $ins_ok = 1 ;
	}
      }
     If ($ins_ok == 1) { $ok = SQL_commande ("INSERT INTO moyennes (eleve,controle,service_classe,service_prof,periode,valeur,type,enregistrement,date_maj,millesime) VALUES ".$requete_ins, $id_sql) ; }
     // Mise a jour table calcul_moyenne
     $res = SQL_commande ("SELECT id_calcul_moyenne FROM calcul_moyenne WHERE classe='".$id_classe."' AND periode='".$periode."' AND service_prof='".$id_sp."' AND service_classe='".$id_sc."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($res) == 1)
      {
       $ligne = SQL_ligne_suivante ($res) ;
       $res = SQL_commande ("UPDATE calcul_moyenne SET ok='1',modification='".$date_maj."' WHERE id_calcul_moyenne='".$ligne [0]."' LIMIT 1", $id_sql) ;
      }
     Else
      {
       $res = SQL_commande ("INSERT INTO calcul_moyenne (classe,periode,service_prof,service_classe,ok,enregistrement,modification,millesime)
                              VALUES ('".$id_classe."','".$periode."','".$id_sp."','".$id_sc."','1','".$date_maj."','".$date_maj."','".$millesime."')", $id_sql) ;
      }
     Return 1 ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Enregistre une note particuliere dans la table des moyennes
 * @param int $id_eleve Identifiant eleve ou classe
 * @param int $id_controle Identifiant controle (0=Moyenne discipline ...)
 * @param int $id_sc Identifiant service classe
 * @param int $id_sp Identifiant service prof
 * @param int $periode Periode
 * @param string $valeur Valeur de la note
 * @param int $type Type de note (voir constantes)
 * @param int $millesime Millesime
 * @return int 0=Non ok,1=Insertion,2=MAJ
 */
 Function sauvegarde_moyenne ($id_eleve,$id_controle,$id_sc,$id_sp,$periode,$valeur,$type,$millesime)
  {
   Global $id_sql ;
   If (($id_sc > 0) And ($id_sp > 0))
    {
     $dt = Date ("Y-m-d h:m:s") ;
     $existe = SQL_commande ("SELECT id_moyenne FROM moyennes WHERE eleve='".$id_eleve."' AND controle='".$id_controle."' AND service_classe='".$id_sc."' AND service_prof='".$id_sp."'
                              AND periode='".$periode."' AND type='".$type."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($existe) == 1)
      {
       $ligne = SQL_ligne_suivante ($existe) ;
       $requete  = "UPDATE moyennes SET valeur='".$valeur."',date_maj='".$dt."' WHERE id_moyenne='".$ligne [0]."' LIMIT 1" ;
       $retour = 2 ;
      }
     Else
      {
       $requete  = "INSERT INTO moyennes (eleve,controle,service_classe,service_prof,periode,valeur,type,enregistrement,date_maj,millesime) VALUES "; 
       $requete .= "('".$id_eleve."','".$id_controle."','".$id_sc."','".$id_sp."','".$periode."','".$valeur."','".$type."','".$dt."','".$dt."','".$millesime."')9" ;
       $retour = 1 ;
      }
     $ok = SQL_commande ($requete, $id_sql) ;
     Return $retour ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi la note arrondie suivant le mode
 * @param mixed $n Note a arrondir
 * @param int $mode Mode d'arrondi
 * 1 = 1 chiffre apres la virgule, 2 = 2 chiffres apres la virgule
 * 3 = 1/10 points superieur, 4 = 1/2 points superieur
 * 5 = Point entier superieur, 6 = 1/10 points le plus proche
 * 7 = 1/2 point le plus proche, 8 = Point entier le plus proche
 * Par defaut arrondi en nombre entier
 * @return mixed Note arrondie
 */
 Function arrondi_note ($n, $mode)
  {
   If ($n != "")
    {
     Switch ($mode)
      {
       // Nombre entier
       Default : $r = Round ($n, 0) ; Break ;
       // 1 chiffre apres la virgule
       Case  1 : $r = Round ($n, 1) ; Break ;
       // 2 chiffres apres la virgule
       Case  2 : $r = Round ($n, 2) ; Break ;
       // 1/10 points superieur
       Case  3 : $r = Round (Ceil (10*$n)/10, 1) ; Break ;
       // 1/2 points superieur
       Case  4 : $r = Round (Ceil (2*$n)/2, 1) ; Break ;
       // Point entier superieur
       Case  5 : $r = Round (Ceil ($n), 1) ; Break ;
       // 1/10 points inferieur
       Case  6 : $r = Round (Floor (10*$n)/10, 1) ; Break ;
       // 1/2 points inferieur
       Case  7 : $r = Round (Floor (2*$n)/2, 1) ; Break ;
       // Point entier inferieur
       Case  8 : $r = Round (Floor ($n), 1) ; Break ;
       // Sans arrondi
       Case  9 : $r = $n ; Break ;
      }
     Return $r ;
    }
   Else { Return $n ; }
  }
 
 /**
 * Renvoi le nom de l'arrondi suivant le mode
 * @param int $mode Mode d'arrondi. Par defaut : nombre entier
 * @return string Nom de l'arrondi
 */
 Function nom_arrondi ($mode)
  {
   Switch ($mode)
    {
     Default : $c = "Nombre entier avec arrondi" ; Break ;
     Case  1 : $c = "Un chiffre apr&egrave;s la virgule" ; Break ;
     Case  2 : $c = "Deux chiffres apr&egrave;s la virgule" ; Break ;
     Case  3 : $c = "Dixi&egrave;me de points sup&eacute;rieur" ; Break ;
     Case  4 : $c = "Demi-point sup&eacute;rieur" ; Break ;
     Case  5 : $c = "Point entier sup&eacute;rieur" ; Break ;
     Case  6 : $c = "Dixi&egrave;me de points inf&eacute;rieur" ; Break ;
     Case  7 : $c = "Demi-point inf&eacute;rieur" ; Break ;
     Case  8 : $c = "Point entier inf&eacute;rieur" ; Break ;
     Case  9 : $c = "Sans arrondi" ; Break ;
    }
   Return $c ;
  }
 
 /**
 * Renvoi le nombre d'arrondis possibles
 * @return int Nombre d'arrondis
 */
 Function nombre_arrondi ()
  {
   Return 9 ;
  }
 
 /**
 * Renvoi la note verifiee
 * @param mixed $n Note a formater
 * @param mixed $note_defaut Note a donner par defaut
 * @return string Note formatee
 */
 Function formate_note ($n,$note_defaut)
  {
   Global $code_non_rendu, $code_absent, $code_dispense, $code_aucune_note ;
   If (Empty ($note_defaut)) { $note_defaut = $code_absent ; }
   // Enleve les espaces de debut et de fin de chaine de caractere
   $n = Trim ($n) ;
   // Note negative ???
   If ($n < 0) { $n = -$n ; }
   // Absent par defaut
   // (Empty ($n) && $n != "0") ||
   If ($n == StrToLower ($code_absent) || $n == StrToUpper ($code_absent)) { Return ($code_absent) ; }  // $code_absent = absent
   ElseIf ($n == StrToLower ($code_dispense) || $n == StrToUpper ($code_dispense)) { Return ($code_dispense) ; } // $code_dispense = dispense
   ElseIf ($n == StrToLower ($code_non_rendu) || $n == StrToUpper ($code_non_rendu)) { Return ($code_non_rendu) ; } // $code_non_rendu = non note
   ElseIf ($n == StrToLower ($code_aucune_note) || $n == StrToUpper ($code_aucune_note)) { Return ($code_aucune_note) ; } // $code_aucune_note = Aucune note
   Else
    {
     $n = Str_Replace (";", ".", Str_Replace (",", ".", $n)) ;
     If (Is_Numeric ($n)) { Return $n ; } Else { Return $note_defaut ; } //Return ("err.") ; }
    }
  }

 /**
 * Renvoie un tableau note [id_eleve] du controle ctrl
 * @param int $ctrl Identifiant SQL du controle
 * @return array Ensemble des valeurs. (Format : [id_eleve]=valeur)
 */
 Function notes_ctrl ($ctrl)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT e.id_eleve,n.valeur FROM eleves e,notes n,controles c WHERE n.eleve=e.id_eleve AND c.id_controle='".$ctrl."' AND e.exterieur>='0'", $id_sql) ;
   While ($ligne = SQL_ligne_suivante ($resultat))
    {
     $retour [$ligne ["e.id_eleve"]] = $ligne ["n.valeur"] ;
    }
   Return $retour ;
  }

 /**
 * Fonction qui renvoi le carnet de notes d'un prof pour une matiere
 * @param int $id_classe Identifiant de la classe
 * @param int $id_discipline Identifiant de la discipline
 * @param int $id_service_prof Identifiant du service prof
 * @param int $periode Numero de periode de visu
 * @param int $millesime Millesime
 * @return array Carnet de notes pour la discipline et chaque eleve
 * ==========================================================
 * Pour une periode :
 *  [0][0][0]=Nbr controles (1..)
 *  [0][0][1]=Nbr eleves (1..)
 *  [0][0][2]=Nbr sous-discipline (1..)
 *  [0][0][3]=Discipline optionnelle si a 1 sinon 0
 *
 *  Pour $j allant de 1 a [0][0][2] (Sous-discipline dans l'ordre) :
 *   [0][0][10+($j-1)*2]=Id sous-matiere
 *   [0][0][11+($j-1)*2]=Nom sous-matiere
 *
 *  [0][$num_controle][0]=id_controle
 *  [0][$num_controle][1]=date
 *  [0][$num_controle][2]=description
 *  [0][$num_controle][3]=coefficient
 *  [0][$num_controle][4]=enregistrement
 *  [0][$num_controle][5]=date_maj
 *  [0][$num_controle][6]=examen
 *  [0][$num_controle][7]=max
 *  [0][$num_controle][8]=Id_sous_matiere
 *  [0][$num_controle][9]=Nom sous-matiere
 *
 *  [$num_eleve][0][0]=Id eleve
 *  [$num_eleve][0][1]=Nom eleve
 *  [$num_eleve][0][2]=Prenoms eleve
 *  [$num_eleve][0][3]=Repere 1
 *  [$num_eleve][0][4]=Repere 2
 *  [$num_eleve][0][5]=Repere 3
 *  [$num_eleve][0][10+($j-1)]=Moyenne sous-matiere numero $j
 *
 *  [$num_eleve][$num_controle][0]=Id_note
 *  [$num_eleve][$num_controle][1]=Note
 *  [$num_eleve][$num_controle][2]=Commentaire
 *  [$num_eleve][$num_controle][3]=Enregistrement
 * ==========================================================
 * Pour l'annee :
 *  [0][0][0]=Nbr periodes (1..)
 *  [0][0][1]=Nbr eleves (1..)
 *
 *  [$num_eleve][0][0]=Id eleve
 *  [$num_eleve][0][1]=Nom eleve
 *  [$num_eleve][0][2]=Prenoms eleve
 *  [$num_eleve][0][3]=Repere 1
 *  [$num_eleve][0][4]=Repere 2
 *  [$num_eleve][0][5]=Repere 3
 *  [$num_eleve][0][6]=Moyenne annee disciplinaire
 *
 *  [$num_eleve][$num_periode][0]=Id_note
 *  [$num_eleve][$num_periode][1]=Note
 *  [$num_eleve][$num_periode][2]=Commentaire
 *  [$num_eleve][$num_periode][3]=Enregistrement
 */
 Function carnet_de_notes ($id_classe,$id_discipline,$id_service_prof,$periode,$millesime)
  {
   Global $id_sql, $code_aucune_note ;
   
   $nbr_periode = nombre_periode ($id_classe) ;
   $date_maj = Date ("Y-m-d H:i:s") ;
   // Liste des eleves
   $liste = caracteristiques_eleves_par_service_classe ($id_service_prof) ;
   $cn [0][0][1] = $liste [0][0] ;
   $cn [0][0][3] = $liste [0][1] ; // Optionnelle
   For ($i = 1 ; $i <= $cn [0][0][1] ; $i++)
    {
     For ($j = 0 ; $j <= 5 ; $j++)
      {
       $cn [$i][0][$j] = $liste [$i][$j] ;
      }
    }
   If ($periode <= $nbr_periode)
    {
     // Carnet a la periode
     // Listes des controles
     $requete  = "SELECT id_controle,date,description,coefficient,enregistrement,date_maj,examen,max,sous_matiere FROM controles " ;
     $requete .= "WHERE classe='".$id_classe."' AND discipline='".$id_discipline."' AND periode='".$periode."' AND service_prof='".$id_service_prof."' AND millesime='".$millesime."' ORDER BY date" ;
     //echo $requete ;
     $resultats = SQL_commande ($requete, $id_sql) ;
     $cn [0][0][0] = SQL_nbr_lignes ($resultats) ;
     If ($cn [0][0][0] > 0)
      {
       For ($i = 1 ; $i <= $cn [0][0][0] ; $i++)
        {
         $ligne = SQL_ligne_suivante ($resultats) ;
         $cn [0][$i][0] = $ligne [0] ;
         $cn [0][$i][1] = $ligne [1] ;
         $cn [0][$i][2] = $ligne [2] ;
         $cn [0][$i][3] = $ligne [3] ;
         $cn [0][$i][4] = $ligne [4] ;
         $cn [0][$i][5] = $ligne [5] ;
         $cn [0][$i][6] = $ligne [6] ;
         $cn [0][$i][7] = $ligne [7] ;
         $cn [0][$i][8] = $ligne [8] ;
        }
       // Sous-matieres
       $sm = SQL_commande ("SELECT id_sous_matiere,nom FROM sous_matieres WHERE millesime='".$millesime."'", $id_sql) ;
       $nbr_sm = SQL_nbr_lignes ($sm) ;
       For ($i = 0 ; $i < $nbr_sm ; $i++)
        {
         $ligne = SQL_ligne_suivante ($sm) ;
         For ($j = 1 ; $j <= $cn [0][0][0] ; $j++)
          {
           If ($cn [0][$j][8] == $ligne [0]) { $cn [0][$j][9] = $ligne [1] ; }
          }
        }
       // Initialisation des notes
       For ($i = 1 ; $i <= $cn [0][0][1] ; $i++)
        {
         For ($j = 1 ; $j <= $cn [0][0][0] ; $j++)
          {
           $cn [$i][$j][0] = 0 ;
           $cn [$i][$j][1] = $code_aucune_note ;
           $cn [$i][$j][2] = "--" ;
           $cn [$i][$j][3] = "-1" ;
          }
        }
       // Association controle->eleve->note
       $requete  = "SELECT e.id_eleve,c.id_controle,n.id_note,n.valeur,n.commentaire,n.enregistrement FROM controles c,notes n,eleves e " ;
       $requete .= "WHERE (" ;
       For ($i = 1 ; $i <= $cn [0][0][0] ; $i++)
        {
         If ($i > 1) { $requete .= " OR " ; }
         $requete .= "c.id_controle='".$cn [0][$i][0]."'" ;
        }
       $requete .= ") AND c.id_controle=n.controle AND n.eleve=e.id_eleve " ;
       $requete .= "ORDER BY e.nom,e.prenoms,c.date,c.enregistrement,c.id_controle,n.enregistrement,n.id_note" ;
       //echo $requete."<br><br>" ;
       $resultats = SQL_commande ($requete, $id_sql) ;
       $nbr_notes = SQL_nbr_lignes ($resultats) ;
       $a_effacer [0] = 0 ;
       For ($num_note = 1 ; $num_note <= $nbr_notes ; $num_note++)
        {
         $ligne = SQL_ligne_suivante ($resultats) ;
         // Test controle
         $j = 1 ;
         While (($j <= $cn [0][0][0]) And ($cn [0][$j][0] != $ligne [1])) { $j++ ; }
         If ($j <= $cn [0][0][0])
          {
           // Test eleve
           $i = 1 ;
           While (($i <= $cn [0][0][1]) And ($cn [$i][0][0] != $ligne [0])) { $i++ ; }
           If ($i <= $cn [0][0][1])
            {
             If ($cn [$i][$j][0] == 0)
              {
               // Ok : Non attribue
               $cn [$i][$j][0] = $ligne [2] ;
               $cn [$i][$j][1] = $ligne [3] ;
               $cn [$i][$j][2] = $ligne [4] ;
               $cn [$i][$j][3] = $ligne [5] ;
              }
             ElseIf ($cn [$i][$j][0] == $ligne [3])
              {
               // C'est la meme : On efface (en trop)
               $a_effacer [0]++ ;
               $a_effacer [$a_effacer [0]] = $ligne [2] ;
              }
             Else
              {
               // On prend la plus recente et on efface l'autre
               If ($ligne [5] > $cn [$i][$j][3])
                {
                 $cn [$i][$j][0] = $ligne [2] ;
                 $cn [$i][$j][1] = $ligne [3] ;
                 $cn [$i][$j][2] = $ligne [4] ;
                 $cn [$i][$j][3] = $ligne [5] ;
                 $a_effacer [0]++ ;
                 $a_effacer [$a_effacer [0]] = $cn [$i][$j][0] ;
                }
               Else
                {
                 $a_effacer [0]++ ;
                 $a_effacer [$a_effacer [0]] = $ligne [2] ;
                }
              }
            }
           Else
            {
             // Pas d'eleve : A effacer
             $a_effacer [0]++ ;
             $a_effacer [$a_effacer [0]] = $ligne [2] ;
            }
          }
         Else
          {
           // Pas de controle : ? (A effacer)
           $a_effacer [0]++ ;
           $a_effacer [$a_effacer [0]] = $ligne [2] ;
          }
        }
       // Sous-matieres ?
       $cn [0][0][2] = 0 ;
       $ok_sous_mat = 0 ;
       $i = 1 ;
       While (($i <= $cn [0][0][0]) And ($cn [0][$i][8] == 0)) { $i++ ; }
       If ($i <= $cn [0][0][0]) { $ok_sous_mat = 1 ; }
       // Classement sous-matieres
       If ($ok_sous_mat == 1)
        {
         For ($i = 1 ; $i <= $cn [0][0][0] ; $i++)
          {
           $nsm [$i-1] = $cn [0][$i][9]."|-|".$cn [0][$i][8] ;
          }
         Sort ($nsm, SORT_STRING) ;
         For ($i = 0 ; $i < $cn [0][0][0] ; $i++)
          {
           $ok_sm = 0 ;
           $ensm = Explode ("|-|", $nsm [$i]) ;
           For ($j = 1 ; $j <= $cn [0][0][2] ; $j++)
            {
             If ($cn [0][0][10+($j-1)*2] == $ensm [1]) { $ok_sm = 1 ; }
            }
           If ($ok_sm == 0)
            {
             $cn [0][0][2]++ ;
             $cn [0][0][10+($cn [0][0][2]-1)*2] = $ensm [1] ;
             $cn [0][0][11+($cn [0][0][2]-1)*2] = $ensm [0] ;
            }
          }
        }
       // Effacement des notes en trop
       If ($a_effacer [0] > 0)
        {
         $effacer = "" ;
         For ($i = 1 ; $i <= $a_effacer [0] ; $i++)
          {
           If ($i > 1) { $effacer .= " OR " ; }
           $effacer .= "id_note='".$a_effacer [$i]."'" ;
          }
         //echo "DELETE FROM notes WHERE ".$effacer."<br>" ;
        }
       // Passage pour voir s'il manque des notes
       $a_ajouter = "" ;
       For ($i = 1 ; $i <= $cn [0][0][1] ; $i++)
        {
         For ($j = 1 ; $j <= $cn [0][0][0] ; $j++)
          {
           If ($cn [$i][$j][0] == 0)
            {
  	     If ($ok_a == 1) { $a_ajouter .= "," ; }
  	     $a_ajouter .= "('".$cn [$i][0][0]."','".$cn [$i][0][3]."','".$cn [$i][0][4]."','".$code_aucune_note."','','".$cn [0][$j][0]."','".Session_Id()."','".$date_maj."','".$millesime."')" ;
  	     $ok_a = 1 ;
	    }
          }
        }
       If ($ok_a == 1)
        {
         //echo "INSERT INTO notes (eleve,repere1,repere2,valeur,commentaire,controle,id,enregistrement,millesime) VALUES ".$a_ajouter."<br>" ;
        }
      }
     Return $cn ;
    }
   Else
    {
     // Carnet a l'annee pour une discipline
     $id_service_classe = service_classe_service_prof ($id_service_prof) ;
     $cn [0][0][0] = $nbr_periode ;
     $cn [0][0][3] = estoptionnelle ($id_discipline, $id_classe, $id_service_classe) ;
     For ($nbr_eleves = 1 ; $nbr_eleves <= $cn [0][0][1] ; $nbr_eleves++)
      {
       $cn [$nbr_eleve][0][6] = $cn [$nbr_eleve][0][7] = 0 ;
      }
     For ($periode = 1 ; $periode <= $cn [0][0][0] ; $periode++)
      {
       For ($nbr_eleves = 1 ; $nbr_eleves <= $cn [0][0][1] ; $nbr_eleves++)
        {
         $cn [$nbr_eleves][$periode][0] = 0 ;
         $cn [$nbr_eleves][$periode][1] = moyenne_el ($cn [$nbr_eleves][0][0], $id_classe, $periode, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ;
	 $cn [$nbr_eleves][$periode][2] = "" ;
	 $cn [$nbr_eleves][$periode][3] = "" ;
	 If (Is_Numeric ($cn [$nbr_eleves][$periode][1]))
	  {
	   $cn [$nbr_eleves][0][6] += $cn [$nbr_eleves][$periode][1] ;
	   $cn [$nbr_eleves][0][7]++ ;
	  }
	}
      }
     For ($nbr_eleves = 1 ; $nbr_eleves <= $cn [0][0][1] ; $nbr_eleves++)
      {
       If ($cn [$nbr_eleves][0][7] > 0) { $cn [$nbr_eleves][0][6] /= $cn [$nbr_eleves][0][7] ; } Else { $cn [$nbr_eleves][0][6] = $code_aucune_note ; }
      }
     Return $cn ;
    }
  }
 
 /**
 * Renvoie la moyenne d'un eleve d'une classe pour une discipline sur une periode pour un professeur
 * @param int $eleve Id eleve
 * @param int $classe Id classe
 * @param int $periode Numero de la periode si < nombre de periodes classe sinon annee
 * @param int $discipline Id discipline
 * @param int $code_sc Id service classe
 * @param int $code_sp Id service prof
 * @param int $formatage Formattage (=1) ou pas (=0) du resultat
 * @param int $type_moy Numero du type de moyenne (Constante)
 * @return float Moyenne ou code indiquant pourquoi il n'y a pas de note
 */
 Function moyenne_el ($eleve, $classe, $periode, $discipline, $code_sc, $code_sp, $formatage, $type_moy)
  {
   Global $id_sql, $code_non_rendu, $code_absent, $code_dispense, $code_aucune_note, $code_pas_discipline ;
   $type_moyenne = champ_disc_type_moyenne_parid ($discipline) ;
   $type_discipline = champ_disc_type_discipline_parid ($discipline) ;
   $date_maj = Date ("Y-m-d H:i:s") ;
   // Test d'acces au carnet de note par le prof
   If ($type_discipline == 0)
    {
     // Discipline NORMALE
     $calcul = SQL_commande ("SELECT ok FROM calcul_moyenne WHERE classe='".$classe."' AND periode='".$periode."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($calcul) == 1)
      {
       $ok = SQL_ligne_suivante ($calcul) ;
       If ((integer)$ok [0] == 1)
        {
	 $resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$periode."' AND type='".$type_moy."' LIMIT 1", $id_sql) ;
	 If (SQL_nbr_lignes ($resultat) == 1)
	  {
	   $ok = SQL_ligne_suivante ($resultat) ;
	   Return $ok [0] ;
	  }
	}
      }
     // Calcul de la moyenne demandee
     $millesime = millesime (0) ;
     // Gestion
     $gst = SQL_commande ("SELECT e.* FROM etablissements e,classes c WHERE c.id_classe='".$classe."' AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
     $gestion = SQL_tableau_associatif ($gst, "") ;
     // Appel carnet de notes
     $carnet = carnet_de_notes ($classe,$discipline,$code_sp,$periode,$millesime) ;
     // Tableau d'enregistrement des notes et moyennes
     $table_moy [0][0] = 0 ;
     If ($carnet [0][0][0] > 0)
      {
       // Determine si il existe une note d'examen blanc parmi les controles
       $ok_exam_blanc = $nbr_exam_blanc = 0 ;
       For ($num_controle = 1 ; $num_controle <= $carnet [0][0][0] ; $num_controle++)
        {
         If ($carnet [0][$num_controle][6] > 0) { $ok_exam_blanc = 1 ; $nbr_exam_blanc++ ; }
        }
       // ======================
       // MOYENNES PARTIELLES
       $moy_el_min = $moy_el_max = $moy_el_min_eb = $moy_el_max_eb = "-" ;
       $ok_c = $ok_c_eb = 0 ;
       For ($num_eleve = 1 ; $num_eleve <= $carnet [0][0][1] ; $num_eleve++)
        {
         For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
          {
           $car_sm [$num_eleve][0][$carnet [0][0][10+($num_sous_disc-1)*2]] = 0 ; // Somme
           $car_sm [$num_eleve][1][$carnet [0][0][10+($num_sous_disc-1)*2]] = 0 ; // Somme coefficients
          }
         $moyenne = $delta = $moy_exam_blanc = $delta_exam_blanc = 0 ;
         For ($num_controle = 1 ; $num_controle <= $carnet [0][0][0] ; $num_controle++)
          {
           If (($carnet [$num_eleve][$num_controle][1] != $code_absent) And ($carnet [$num_eleve][$num_controle][1] != $code_non_rendu) And
               ($carnet [$num_eleve][$num_controle][1] != $code_dispense) And ($carnet [$num_eleve][$num_controle][1] != $code_aucune_note))
            {
             // Moyenne normale
             $moyenne += ($carnet [$num_eleve][$num_controle][1]*$gestion ["max"]/$carnet [0][$num_controle][7])*$carnet [0][$num_controle][3] ;
             $delta += $carnet [0][$num_controle][3] ;
             // Moyenne sous-matieres
             If ($carnet [0][0][2] > 0)
              {
               For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
                {
                 If ($carnet [0][$num_controle][8] == $carnet [0][0][10+($num_sous_disc-1)*2])
                  {
                   $car_sm [$num_eleve][0][$carnet [0][0][10+($num_sous_disc-1)*2]] += ($carnet [$num_eleve][$num_controle][1]*$gestion ["max"]/$carnet [0][$num_controle][7])*$carnet [0][$num_controle][3] ;
                   $car_sm [$num_eleve][1][$carnet [0][0][10+($num_sous_disc-1)*2]] += $carnet [0][$num_controle][3] ;
                  }
                }
              }
             // Moyenne exam
             If ($carnet [0][$num_controle][6] > 0)
              {
               $moy_exam_blanc += ($carnet [$num_eleve][$num_controle][1]*$gestion ["max"]/$carnet [0][$num_controle][7])*$carnet [0][$num_controle][6] ;
               $delta_exam_blanc += $carnet [0][$num_controle][6] ;
              }
            }
          }
         // Colonne moyenne partielle
         If ($delta > 0)
          {
           $moy = $moyenne/$delta ;
           $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],0,$code_sc,$code_sp,$periode,$moy,NOTE_MOY_ELEVE_DISC,$millesime) ;
           If ($moy_el_min == "-") { $moy_el_min = $moy_el_max = $moy ; $ok_c = 1 ; }
           Else
            {
             If ($moy < $moy_el_min) { $moy_el_min = $moy ; $ok_c = 1 ; }
             If ($moy > $moy_el_max) { $moy_el_max = $moy ; $ok_c = 1 ; }
	    }
	   // Ajouter a la moyenne trimestrielle si ce n'est pas une option ou si la moyenne est > max/2
	   If (($carnet [0][0][3] == 0) Or (($carnet [0][0][3] == 1) And ($moy > $gestion ["max"]/2)))
	    {
             $moy_tri += $moy ;
             $delta_tri++ ;
	    }
          }
	 Else { $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],0,$code_sc,$code_sp,$periode,$code_aucune_note,NOTE_MOY_ELEVE_DISC,$millesime) ; }
         // Colonne moyennes sous-matieres si existe
         If ($carnet [0][0][2] > 0)
          {
           For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
            {
	     $c0 = $carnet [0][0][10+($num_sous_disc-1)*2] ;
             $c1 = $car_sm [$num_eleve][0][$c0] ;
             $c2 = $car_sm [$num_eleve][1][$c0] ;
             If ($c2 > 0) { $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],$c0,$code_sc,$code_sp,$periode,($c1/$c2),NOTE_MOY_ELEVE_SMAT,$millesime) ; }
             Else { $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],$c0,$code_sc,$code_sp,$periode,0,NOTE_MOY_ELEVE_SMAT,$millesime) ; }
            }
          }
         // Colonne moyenne examen blanc si existe
         If (($delta_exam_blanc > 0) And ($nbr_exam_blanc > 0))
          {
           $moy_eb = $moy_exam_blanc/$delta_exam_blanc ;
           $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],0,$code_sc,$code_sp,$periode,$moy_eb,NOTE_MOY_ELEVE_EXAM,$millesime) ;
           If ($moy_el_min_eb == "-") { $moy_el_min_eb = $moy_el_max_eb = $moy_eb ; $ok_c_eb = 1 ; }
           Else
            {
             If ($moy_eb < $moy_el_min_eb) { $moy_el_min_eb = $moy_eb ; $ok_c_eb = 1 ; }
             If ($moy_eb > $moy_el_max_eb) { $moy_el_max_eb = $moy_eb ; $ok_c_eb = 1 ; }
            }
           $moy_tri_eb += $moy_exam_blanc/$delta_exam_blanc ;
           $delta_tri_eb++ ;
          }
         Else
          {
           If ($nbr_exam_blanc > 0) { $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],0,$code_sc,$code_sp,$periode,0,NOTE_MOY_ELEVE_EXAM,$millesime) ; }
	   Else { $table_moy = creation_table_moyenne ($table_moy,$carnet [$num_eleve][0][0],0,$code_sc,$code_sp,$periode,$code_aucune_note,NOTE_MOY_ELEVE_EXAM,$millesime) ; }
          }
        }
       // ======================
       // Moyennes des controles
       UnSet ($ok) ;
       For ($num_controle = 1 ; $num_controle <= $carnet [0][0][0] ; $num_controle++)
        {
         $moy = $delta = 0 ;
         $min [$num_controle] = $max [$num_controle] = "-" ;
         $ok [$num_controle] = 0 ;
         For ($num_eleve = 1 ; $num_eleve <= $carnet [0][0][1] ; $num_eleve++)
          {
           If (($carnet [$num_eleve][$num_controle][1] != $code_absent) And ($carnet [$num_eleve][$num_controle][1] != $code_non_rendu) And
           ($carnet [$num_eleve][$num_controle][1] != $code_dispense) And ($carnet [$num_eleve][$num_controle][1] != $code_aucune_note))
            {
             $moy += $carnet [$num_eleve][$num_controle][1] ;
             $delta++ ;
             If ($min [$num_controle] == "-") { $min [$num_controle] = $max [$num_controle] = $carnet [$num_eleve][$num_controle][1] ; $ok [$num_controle] = 1 ; }
             Else
              {
               If ($carnet [$num_eleve][$num_controle][1] < $min [$num_controle]) { $min [$num_controle] = $carnet [$num_eleve][$num_controle][1] ; $ok [$num_controle] = 1 ; }
               If ($carnet [$num_eleve][$num_controle][1] > $max [$num_controle]) { $max [$num_controle] = $carnet [$num_eleve][$num_controle][1] ; $ok [$num_controle] = 1 ; }
              }
            }
          }
         If ($delta > 0) { $table_moy = creation_table_moyenne ($table_moy,$classe,$carnet [0][$num_controle][0],$code_sc,$code_sp,$periode,($moy/$delta),NOTE_MOY_CLASSE_CONTROLE,$millesime) ; }
	 Else { $table_moy = creation_table_moyenne ($table_moy,$classe,$carnet [0][$num_controle][0],$code_sc,$code_sp,$periode,$code_aucune_note,NOTE_MOY_CLASSE_CONTROLE,$millesime) ; }
        }
       If ($type_moyenne == MOYENNE_NORMALE)
        {
         If (($moy_tri > 0) And ($delta_tri > 0))
          { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,($moy_tri/$delta_tri),NOTE_MOY_CLASSE_DISC,$millesime) ; }
         Else
          { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,0,NOTE_MOY_CLASSE_DISC,$millesime) ; }
         // Colonne moyennes sous-matieres si existe
         If ($carnet [0][0][2] > 0)
          {
           For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
            {
	     $c0 = $carnet [0][0][10+($num_sous_disc-1)*2] ;
             $c1 = $c2 = 0 ;
	     For ($num_eleve = 1 ; $num_eleve <= $carnet [0][0][1] ; $num_eleve++)
              {
               If ($car_sm [$num_eleve][1][$c0] > 0)
                {
                 $c1 += ($car_sm [$num_eleve][0][$c0]/$car_sm [$num_eleve][1][$c0]) ;
                 $c2++ ;
                }
              }
             If ($c2 > 0) { $table_moy = creation_table_moyenne ($table_moy,$classe,$c0,$code_sc,$code_sp,$periode,($c1/$c2),NOTE_MOY_CLASSE_SMAT,$millesime) ; }
            }
          }
         // Colonne moyenne classe examen blanc si existe
         If (($moy_tri_eb > 0) And ($delta_tri_eb > 0))
          { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,($moy_tri_eb/$delta_tri_eb),NOTE_MOY_CLASSE_DISC_EXAM,$millesime) ; }
         Else
          { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,0,NOTE_MOY_CLASSE_DISC_EXAM,$millesime) ; }
        }
       // ======================
       // Minimum des controles
       For ($num_controle = 1 ; $num_controle <= $carnet [0][0][0] ; $num_controle++)
        {
         If ($ok [$num_controle] == 1) { $table_moy = creation_table_moyenne ($table_moy,$classe,$carnet [0][$num_controle][0],$code_sc,$code_sp,$periode,$min [$num_controle],NOTE_MIN_CLASSE_CONTROLE,$millesime) ; }
        }
       If ($type_moyenne == MOYENNE_NORMALE)
        {
         If ($ok_c == 1) { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$moy_el_min,NOTE_MIN_CLASSE_DISC,$millesime) ; }
         // Colonne minimum sous-matieres si existe
         If ($carnet [0][0][2] > 0)
          {
           For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
            {
	     $cn = $carnet [0][0][10+($num_sous_disc-1)*2] ;
             $c1 = $car_sm [0][0][$cn] ;
             $c2 = $car_sm [0][1][$cn] ;
             If ($c2 > 0) { $c0 = $c1/$c2 ; } Else { $c0 = "-" ; }
	     For ($num_eleve = 1 ; $num_eleve <= $carnet [0][0][1] ; $num_eleve++)
              {
               $c1 = $car_sm [$num_eleve][0][$cn] ;
               $c2 = $car_sm [$num_eleve][1][$cn] ;
               If ($c2 > 0) { If ($c0 == "-") { $c0 = $c1/$c2 ; } ElseIf ($c1/$c2 < $c0) { $c0 = $c1/$c2 ; } }
              }
             If ($c0 != "-") { $table_moy = creation_table_moyenne ($table_moy,$classe,$cn,$code_sc,$code_sp,$periode,$c0,NOTE_MIN_CLASSE_SMAT,$millesime) ; }
             Else { $table_moy = creation_table_moyenne ($table_moy,$classe,$cn,$code_sc,$code_sp,$periode,0,NOTE_MIN_CLASSE_SMAT,$millesime) ; }
            }
          }
         // Colonne moyenne minimum examen blanc si existe
         If ($ok_c_eb == 1) { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$moy_el_min_eb,NOTE_MIN_CLASSE_DISC_EXAM,$millesime) ; }
	 Else { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$code_aucune_note,NOTE_MIN_CLASSE_DISC_EXAM,$millesime) ; }
        }
       // ======================
       // Maximum des controles
       For ($num_controle = 1 ; $num_controle <= $carnet [0][0][0] ; $num_controle++)
        {
         If ($ok [$num_controle] == 1) { $table_moy = creation_table_moyenne ($table_moy,0,$carnet [0][$num_controle][0],$code_sc,$code_sp,$periode,$max [$i],NOTE_MAX_CLASSE_CONTROLE,$millesime) ; }
        }
       If ($type_moyenne == MOYENNE_NORMALE)
        {
         If ($ok_c == 1) { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$moy_el_max,NOTE_MAX_CLASSE_DISC,$millesime) ; }
         // Colonne maximum sous-matieres si existe
         If ($carnet [0][0][2] > 0)
          {
           For ($num_sous_disc = 1 ; $num_sous_disc <= $carnet [0][0][2] ; $num_sous_disc++)
            {
	     $cn = $carnet [0][0][10+($num_sous_disc-1)*2] ;
             $c1 = $car_sm [0][0][$cn] ;
             $c2 = $car_sm [0][1][$cn] ;
             If ($c2 > 0) { $c0 = $c1/$c2 ; } Else { $c0 = "-" ; }
	     For ($num_eleve = 1 ; $num_eleve <= $carnet [0][0][1] ; $num_eleve++)
              {
               $c1 = $car_sm [$num_eleve][0][$cn] ;
               $c2 = $car_sm [$num_eleve][1][$cn] ;
               If ($c2 > 0) { If ($c0 == "-") { $c0 = $c1/$c2 ; } ElseIf ($c1/$c2 > $c0) { $c0 = $c1/$c2 ; } }
              }
             If ($c0 != "-") { $table_moy = creation_table_moyenne ($table_moy,$classe,$cn,$code_sc,$code_sp,$periode,$c0,NOTE_MAX_CLASSE_SMAT,$millesime) ; }
             Else { $table_moy = creation_table_moyenne ($table_moy,$classe,$cn,$code_sc,$code_sp,$periode,0,NOTE_MAX_CLASSE_SMAT,$millesime) ; }
            }
          }
         // Colonne moyenne maximum examen blanc si existe
         If ($ok_c_eb == 1) { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$moy_el_max_eb,NOTE_MAX_CLASSE_DISC_EXAM,$millesime) ; }
	 Else { $table_moy = creation_table_moyenne ($table_moy,$classe,0,$code_sc,$code_sp,$periode,$code_aucune_note,NOTE_MAX_CLASSE_DISC_EXAM,$millesime) ; }
        }
       // Sauvegarde de toutes les notes
       sauvegarde_table_moyenne ($table_moy,$classe,$code_sc,$code_sp,$periode,$millesime) ;
       // Recherche de la bonne
       $resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$periode."' AND type='".$type_moy."' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($resultat) != 1) { $ok [0] = $code_pas_discipline ; } Else { $ok = SQL_ligne_suivante ($resultat) ; }
       Return $ok [0] ;
      }
     Else
      {
       // Aucune note
       Return $code_aucune_note ;
      }
    }
   ElseIf ($type_discipline == 3)
    {
     // Discipline SPECIFIQUE avec une seule et unique note donc pas de moyenne a calculer
     $requete  = "SELECT n.valeur FROM notes n,controles c WHERE n.controle=c.id_controle AND n.eleve='".$eleve."' AND c.discipline='".$discipline."' AND c.classe='".$classe."' " ;
     $requete .= "AND c.service_prof='".$code_sp."' AND c.periode='".$periode."'" ;
     If ($periode <= $nombre_p_max [0]) { $requete .= " AND c.periode='".$periode."'" ; }
     If ($type_moy == NOTE_MOY_ELEVE_EXAM) { $requete .= " AND c.examen>'0'" ; }
     $resultat = SQL_commande ($requete, $id_sql) ;
     $nbr_notes = SQL_nbr_lignes ($resultat) ;
     If ($nbr_notes == 1) { $ligne = SQL_ligne_suivante ($resultat) ; } Else { $ligne [0] = $code_aucune_note ; }
     Return $ligne [0] ;
    }
  }

 /**
 * Renvoie la moyenne annuelle d'un eleve d'une classe pour une discipline pour un professeur. Cette moyenne est le calcul de la moyenne des moyennes des differentes periodes
 * @param int $eleve Id eleve
 * @param int $classe Id classe
 * @param int $discipline Id discipline
 * @param int $code_sc Id service classe
 * @param int $code_sp Id service prof
 * @param int $formatage Formattage (=1) ou pas (=0) du resultat
 * @param int $type_moy Numero du type de moyenne
 * @return float Moyenne ou code indiquant pourquoi il n'y a pas de note
 */
 Function moyenne_annuelle ($eleve, $classe, $discipline, $code_sc, $code_sp, $formatage, $type_moy)
  {
   Global $id_sql, $code_non_rendu, $code_absent, $code_dispense, $code_aucune_note, $code_pas_discipline, $debug_SQL ;
   
   $num_periode_annuelle = nombre_periode ($classe)+1 ;
   $millesime = millesime (0) ;
   $date_maj = Date ("Y-m-j H:i:s") ;
   $calcul = SQL_commande ("SELECT ok FROM calcul_moyenne WHERE classe='".$classe."' AND periode='".$num_periode_annuelle."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($calcul) == 1) { $ok = SQL_ligne_suivante ($calcul) ; } Else { $ok [0] = 0 ; }
   // Recherche et calcul moyenne
   If ((integer)$ok [0] == 1)
    {
     $resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$num_periode_annuelle."' AND type='".$type_moy."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1) { $ok [0] = 1 ; } Else { $ok [0] = 0 ; }
    }
   If ((integer)$ok [0] == 0)
    {
     // Tableau d'enregistrement des notes et moyennes
     $table_moy [0][0] = 0 ;
     
     $resultat = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$code_sc."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $res = SQL_tableau_associatif ($resultat, "") ;
       $ok = 0 ;
       If ((integer)$res ["optionnelle"] == 1)
        {
         // Discipline OPTIONNELLE
         If ((integer)$res ["groupe"] == 1)
          {
	   // Option + Groupe
	   $res1 = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$eleve."' AND discipline='".$res ["discipline"]."' AND service_classe='".$code_sc."' AND millesime='".$millesime."'", $id_sql) ;
	   $res2 = SQL_commande ("SELECT e.id_groupe_eleve,c.id_groupe_classe
	                            FROM groupes_eleve e,groupes_classe c WHERE e.eleve='".$eleve."'
			  	     AND e.discipline='".$res ["discipline"]."' AND c.discipline='".$res ["discipline"]."'
				     AND e.groupe=c.id_groupe_classe AND e.millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res2) > 0) { $ok = 3 ; }
	  }
         Else
          {
	   // Option seule
	   $res1 = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$eleve."' AND discipline='".$res ["discipline"]."' AND service_classe='".$code_sc."' AND millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res1) > 0) { $ok = 1 ; }
	  }
        }
       Else
        {
         // Discipline OBLIGATOIRE
         If ((integer)$res ["groupe"] == 1)
          {
	   // Groupe seul
	   $res2 = SQL_commande ("SELECT e.id_groupe_eleve,c.id_groupe_classe FROM groupes_eleve e, groupes_classe c
	                           WHERE e.eleve='".$eleve."' AND e.discipline='".$res ["discipline"]."' AND c.discipline='".$res ["discipline"]."'
			  	     AND e.groupe=c.id_groupe_classe AND c.service_classe='".$code_sc."' AND e.millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res2) > 0) { $ok = 2 ; }
	  }
         Else { $ok = 1 ; }
        }
       If ($ok > 0)
        {
         // Recherche du format d'affichage des notes
         $resultat = SQL_commande ("SELECT * FROM gestion LIMIT 1", $id_sql) ;
	 $format = SQL_tableau_associatif ($resultat, "") ;
	 If (!IsSet ($format ["moyenne"]) Or !IsSet ($format ["max"]))
	  {
	   $resultat = SQL_commande ("SELECT * FROM etablissements t,eleves e,classes c WHERE e.id_eleve='".$eleve."' AND e.classe=c.id_classe AND c.etablissement=t.id_etablissement LIMIT 1", $id_sql) ;
           $format = SQL_tableau_associatif ($resultat, "") ;
	  }
         // Recherche et calcul moyenne
	 If ($format ["moyenne"] == 0)
	  {
	   // Methode de calcul de la moyenne des moyennes de chacune des periodes
	   $moy_ann = $nbr_moy = 0 ;
	   For ($periode = 1 ; $periode < $num_periode_annuelle ; $periode++)
	    {
	     $m = moyenne_el ($eleve, $classe, $periode, $discipline, $code_sc, $code_sp, $formatage, $type_moy) ;
	     If (($m != $code_non_rendu) And ($m != $code_absent) And ($m != $code_dispense) And ($m != $code_aucune_note) And ($m != $code_pas_discipline))
	      {
	       $moy_ann += $m ;
	       $nbr_moy++ ;
	      }
            }
           If ($nbr_moy > 0)
	    {
	     $moy_ann = $moy_ann/$nbr_moy ;
	     $table_moy = creation_table_moyenne ($table_moy,$eleve,0,$code_sc,$code_sp,$num_periode_annuelle,$moy_ann,$type_moy,$millesime) ;
	     // Sauvegarde de toutes les notes
             sauvegarde_table_moyenne ($table_moy,$classe,$code_sc,$code_sp,$periode,$millesime) ;
	     If ($formatage == 1) { Return arrondi_note ($moy_ann, $format ["nombre_chiffres"]) ; } Else { Return ($moy_ann) ; }
	    }
           Else { Return $code_aucune_note ; }
          }
         Else
	  {
	   // Methode de la moyenne de l'ensemble des notes de l'annee
	   $requete = "SELECT SUM(n.valeur*".$format ["max"]."*c.coefficient/c.max) AS somme,SUM(c.coefficient) AS diviseur
                         FROM notes n, controles c
                        WHERE n.valeur!='".$code_non_rendu."' AND n.valeur!='".$code_absent."' AND n.valeur!='".$code_aucune_note."'
		          AND n.valeur!='".$code_dispense."' AND n.controle=c.id_controle AND n.eleve='".$eleve."'
		          AND c.discipline='".$discipline."' AND c.classe='".$classe."'
                          AND c.service_prof='".$code_sp."' AND c.millesime='".$millesime."'" ;
           $resultat = SQL_commande ($requete, $id_sql) ;
	   $ligne = SQL_ligne_suivante ($resultat) ;
	   If ($ligne [1] > 0)
	    {
	     $moy_ann += $ligne [0]/$ligne [1] ;
	     $table_moy = creation_table_moyenne ($table_moy,$eleve,0,$code_sc,$code_sp,$num_periode_annuelle,$moy_ann,$type_moy,$millesime) ;
	     // Sauvegarde de toutes les notes
             sauvegarde_table_moyenne ($table_moy,$classe,$code_sc,$code_sp,$periode,$millesime) ;
	     If ($formatage == 1) { Return arrondi_note ($moy_ann, $format ["nombre_chiffres"]) ; } Else { Return ($moy_ann) ; }
	    }
           Else { Return $code_aucune_note ; }
	  }
        }
       Else
        {
         // Eleve qui ne suit pas cette discipline
         Return $code_pas_discipline ;
        }
      }
    }
   Else
    {
     // Calculs deja effectues
     If ($formatage == 1)
      {
       // Recherche du format d'affichage des notes
       $rest = SQL_commande ("SELECT * FROM gestion ORDER BY millesime DESC LIMIT 1", $id_sql) ;
       $format = SQL_tableau_associatif ($rest, "") ;
       If (!IsSet ($format ["nombre_chiffres"]))
        {
	 $rest = SQL_commande ("SELECT * FROM etablissements t,eleves e,classes c WHERE e.id_eleve='".$eleve."' AND e.classe=c.id_classe AND c.etablissement=t.id_etablissement LIMIT 1", $id_sql) ;
         $format = SQL_tableau_associatif ($rest, "") ;
	}
      }
     // Recherche et calcul moyenne
     //$resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$num_periode_annuelle."' AND type='".$type_moy."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If ($ligne = SQL_ligne_suivante ($resultat))
      {
       If ($formatage == 1) { Return arrondi_note ($ligne [0], $format ["nombre_chiffres"]) ; }
       Else { Return $ligne [0] ; }
      }
     Else { Return $code_aucune_note ; }
    }
  }

 /**
 * Renvoie la moyenne d'une tranche entre deux periodes d'un eleve d'une classe pour une discipline pour un professeur. Cette moyenne est le calcul de la moyenne des moyennes des differentes periodes
 * @param int $periode_debut Numero de la periode debut
 * @param int $periode_fin Numero de la periode fin
 * @param int $eleve Id eleve
 * @param int $classe Id classe
 * @param int $discipline Id discipline
 * @param int $code_sc Id service classe
 * @param int $code_sp Id service prof
 * @param int $formatage Formattage (=1) ou pas (=0) du resultat
 * @param int $type_moy Numero du type de moyenne
 * @return float Moyenne ou code indiquant pourquoi il n'y a pas de note
 */
 Function moyenne_tranche ($periode_debut, $periode_fin, $eleve, $classe, $discipline, $code_sc, $code_sp, $formatage, $type_moy)
  {
   Global $id_sql, $code_non_rendu, $code_absent, $code_dispense, $code_aucune_note, $code_pas_discipline, $debug_SQL ;
   
   $num_periode_annuelle = 100*100+100*$periode_debut+$periode_fin ;
   $millesime = millesime (0) ;
   $date_maj = Date ("Y-m-j H:i:s") ;
   $calcul = SQL_commande ("SELECT ok FROM calcul_moyenne WHERE classe='".$classe."' AND periode='".$num_periode_annuelle."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($calcul) == 1) { $ok = SQL_ligne_suivante ($calcul) ; } Else { $ok [0] = 0 ; }
   // Recherche et calcul moyenne
   If ((integer)$ok [0] == 1)
    {
     $resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$num_periode_annuelle."' AND type='".$type_moy."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1) { $ok [0] = 1 ; } Else { $ok [0] = 0 ; }
    }
   If ((integer)$ok [0] == 0)
    {
     // Tableau d'enregistrement des notes et moyennes
     $table_moy [0][0] = 0 ;
     
     $resultat = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$code_sc."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $res = SQL_tableau_associatif ($resultat, "") ;
       $ok = 0 ;
       If ((integer)$res ["optionnelle"] == 1)
        {
         // Discipline OPTIONNELLE
         If ((integer)$res ["groupe"] == 1)
          {
	   // Option + Groupe
	   $res1 = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$eleve."' AND discipline='".$res ["discipline"]."' AND service_classe='".$code_sc."' AND millesime='".$millesime."'", $id_sql) ;
	   $res2 = SQL_commande ("SELECT e.id_groupe_eleve,c.id_groupe_classe
	                            FROM groupes_eleve e,groupes_classe c WHERE e.eleve='".$eleve."'
			  	     AND e.discipline='".$res ["discipline"]."' AND c.discipline='".$res ["discipline"]."'
				     AND e.groupe=c.id_groupe_classe AND e.millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res2) > 0) { $ok = 3 ; }
	  }
         Else
          {
	   // Option seule
	   $res1 = SQL_commande ("SELECT id_option_eleve FROM options_eleve WHERE eleve='".$eleve."' AND discipline='".$res ["discipline"]."' AND service_classe='".$code_sc."' AND millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res1) > 0) { $ok = 1 ; }
	  }
        }
       Else
        {
         // Discipline OBLIGATOIRE
         If ((integer)$res ["groupe"] == 1)
          {
	   // Groupe seul
	   $res2 = SQL_commande ("SELECT e.id_groupe_eleve,c.id_groupe_classe FROM groupes_eleve e, groupes_classe c
	                           WHERE e.eleve='".$eleve."' AND e.discipline='".$res ["discipline"]."' AND c.discipline='".$res ["discipline"]."'
			  	     AND e.groupe=c.id_groupe_classe AND c.service_classe='".$code_sc."' AND e.millesime='".$millesime."'", $id_sql) ;
	   If (SQL_nbr_lignes ($res2) > 0) { $ok = 2 ; }
	  }
         Else { $ok = 1 ; }
        }
       If ($ok > 0)
        {
         // Recherche du format d'affichage des notes
         $resultat = SQL_commande ("SELECT * FROM gestion LIMIT 1", $id_sql) ;
	 $format = SQL_tableau_associatif ($resultat, "") ;
	 If (!IsSet ($format ["moyenne"]) Or !IsSet ($format ["max"]))
	  {
	   $resultat = SQL_commande ("SELECT * FROM etablissements t,eleves e,classes c WHERE e.id_eleve='".$eleve."' AND e.classe=c.id_classe AND c.etablissement=t.id_etablissement LIMIT 1", $id_sql) ;
           $format = SQL_tableau_associatif ($resultat, "") ;
	  }
         // Recherche et calcul moyenne
	 If ($format ["moyenne"] == 0)
	  {
	   // Methode de calcul de la moyenne des moyennes de chacune des periodes
	   $moy_ann = $nbr_moy = 0 ;
	   For ($periode = $periode_debut ; $periode <=  $periode_fin ; $periode++)
	    {
	     $m = moyenne_el ($eleve, $classe, $periode, $discipline, $code_sc, $code_sp, $formatage, $type_moy) ;
	     If (($m != $code_non_rendu) And ($m != $code_absent) And ($m != $code_dispense) And ($m != $code_aucune_note) And ($m != $code_pas_discipline))
	      {
	       $moy_ann += $m ;
	       $nbr_moy++ ;
	      }
            }
           If ($nbr_moy > 0)
	    {
	     $moy_ann = $moy_ann/$nbr_moy ;
	     $table_moy = creation_table_moyenne ($table_moy,$eleve,0,$code_sc,$code_sp,$num_periode_annuelle,$moy_ann,$type_moy,$millesime) ;
	     // Sauvegarde de toutes les notes
             sauvegarde_table_moyenne ($table_moy,$classe,$code_sc,$code_sp,$periode,$millesime) ;
	     If ($formatage == 1) { Return arrondi_note ($moy_ann, $format ["nombre_chiffres"]) ; } Else { Return ($moy_ann) ; }
	    }
           Else { Return $code_aucune_note ; }
          }
         Else
	  {
	   // Methode de la moyenne de l'ensemble des notes de l'annee
	   $requete = "SELECT SUM(n.valeur*".$format ["max"]."*c.coefficient/c.max) AS somme,SUM(c.coefficient) AS diviseur
                         FROM notes n, controles c
                        WHERE n.valeur!='".$code_non_rendu."' AND n.valeur!='".$code_absent."' AND n.valeur!='".$code_aucune_note."'
		          AND n.valeur!='".$code_dispense."' AND n.controle=c.id_controle AND n.eleve='".$eleve."'
		          AND c.discipline='".$discipline."' AND c.classe='".$classe."'
                          AND c.service_prof='".$code_sp."' AND c.millesime='".$millesime."'
			  AND c.periode>='".$periode_debut."' AND c.periode<='".$periode_fin."'" ;
           $resultat = SQL_commande ($requete, $id_sql) ;
	   $ligne = SQL_ligne_suivante ($resultat) ;
	   If ($ligne [1] > 0)
	    {
	     $moy_ann += $ligne [0]/$ligne [1] ;
	     $table_moy = creation_table_moyenne ($table_moy,$eleve,0,$code_sc,$code_sp,$num_periode_annuelle,$moy_ann,$type_moy,$millesime) ;
	     // Sauvegarde de toutes les notes
             sauvegarde_table_moyenne ($table_moy,$classe,$code_sc,$code_sp,$periode,$millesime) ;
	     If ($formatage == 1) { Return arrondi_note ($moy_ann, $format ["nombre_chiffres"]) ; } Else { Return ($moy_ann) ; }
	    }
           Else { Return $code_aucune_note ; }
	  }
        }
       Else
        {
         // Eleve qui ne suit pas cette discipline
         Return $code_pas_discipline ;
        }
      }
    }
   Else
    {
     // Calculs deja effectues
     If ($formatage == 1)
      {
       // Recherche du format d'affichage des notes
       $rest = SQL_commande ("SELECT * FROM gestion ORDER BY millesime DESC LIMIT 1", $id_sql) ;
       $format = SQL_tableau_associatif ($rest, "") ;
       If (!IsSet ($format ["nombre_chiffres"]))
        {
	 $rest = SQL_commande ("SELECT * FROM etablissements t,eleves e,classes c WHERE e.id_eleve='".$eleve."' AND e.classe=c.id_classe AND c.etablissement=t.id_etablissement LIMIT 1", $id_sql) ;
         $format = SQL_tableau_associatif ($rest, "") ;
	}
      }
     // Recherche et calcul moyenne
     //$resultat = SQL_commande ("SELECT valeur FROM moyennes WHERE eleve='".$eleve."' AND service_classe='".$code_sc."' AND service_prof='".$code_sp."' AND periode='".$num_periode_annuelle."' AND type='".$type_moy."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If ($ligne = SQL_ligne_suivante ($resultat))
      {
       If ($formatage == 1) { Return arrondi_note ($ligne [0], $format ["nombre_chiffres"]) ; }
       Else { Return $ligne [0] ; }
      }
     Else { Return $code_aucune_note ; }
    }
  }

 /**
 * Calcul de la moyenne, minimum et maximum pour une classe, discipline et periode
 * @param int $id_classe Id classe
 * @param int $id_discipline Id discipline
 * @param int $periode Numero periode
 * @param int $id_service_classe Id service classe
 * @param int $id_service_prof Id service prof
 * @return array Tableau avec les champs "moy", "min", "max", "total" et "diviseur" contenant la moyenne, le minimum, le maximum, la somme totale et le nombre de notes
 */
 Function stats_disc ($id_classe, $id_discipline, $periode, $id_service_classe, $id_service_prof, $millesime)
  {
   Global $id_sql, $code_aucune_note, $code_pas_discipline, $code_absent, $code_dispense ;
   $retour ["moy"] = $retour ["min"] = $retour ["max"] = $code_aucune_note ;
   // Recherche et calcul moyenne
   If ($id_discipline > 0)
    {
     $table = eleves_par_service_classe ($id_service_prof) ;
     $nbr_periodes = nombre_periode ($id_classe) ;
     $diviseur = 0 ;
     $total = 0 ;
     $ok = 0 ;
     For ($i = 1 ; $i <= $table [0] ; $i++)
      {
       If ($periode <= $nbr_periodes) { $m = moyenne_el ($table [$i], $id_classe, $periode, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
       Else { $m = moyenne_annuelle ($table [$i], $id_classe, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
       If (Is_Numeric ($m))
        {
         If ($ok == 0) { $mini = $maxi = $m ; $ok = 1 ; }
         Else
          {
           If ($m < $mini) { $mini = $m ; }
           If ($m > $maxi) { $maxi = $m ; }
  	  }
         $total += $m ;
         $diviseur++ ;
        }
      }
     If ($diviseur > 0)
      {
       $retour ["moy"] = $total/$diviseur ;
       $retour ["min"] = $mini ;
       $retour ["max"] = $maxi ;
       $retour ["total"] = $total ;
       $retour ["nombre"] = $diviseur ;
       // Mise a jour de la base
       $ok = SQL_commande ("SELECT id_moyenne,valeur,type FROM moyennes WHERE eleve='".$id_classe."' AND controle='0' AND service_prof='".$id_service_prof."' AND service_classe='".$id_service_classe."' AND periode='".$periode."'
                               AND (type='".NOTE_MOY_CLASSE_DISC."' OR type='".NOTE_MIN_CLASSE_DISC."' OR type='".NOTE_MAX_CLASSE_DISC."') AND millesime='".$millesime."'", $id_sql) ;
       $nbr_ok = SQL_nbr_lignes ($ok) ;
       $date_maj = Date ("Y-m-d H:i:s") ;
       If ($nbr_ok > 0)
        {
         $nbr_maj = 0 ;
         For ($i = 0 ; $i < $nbr_ok ; $i++)
          {
           $ligne = SQL_ligne_suivante ($ok) ;
           $valeur = "=" ;
           Switch ($ligne [2])
            {
	     Case NOTE_MOY_CLASSE_DISC : If ($ligne [1] != $retour ["moy"]) { $valeur = $retour ["moy"] ; } Break ;
	     Case NOTE_MIN_CLASSE_DISC : If ($ligne [1] != $retour ["min"]) { $valeur = $retour ["min"] ; } Break ;
	     Case NOTE_MAX_CLASSE_DISC : If ($ligne [1] != $retour ["max"]) { $valeur = $retour ["max"] ; } Break ;
  	    }
           If ($valeur != "=") { $up = SQL_commande ("UPDATE moyennes SET valeur='".$valeur."',date_maj='".$date_maj."' WHERE id_moyenne='".$ligne [0]."' LIMIT 1", $id_sql) ; }
	  }
        }
       Else
        {
         $res = SQL_commande ("INSERT INTO moyennes (eleve,controle,service_classe,service_prof,periode,valeur,type,enregistrement,date_maj,millesime) VALUES
                               ('".$id_classe."','0','".$id_service_classe."','".$id_service_prof."','".$periode."','".$retour ["moy"]."','".NOTE_MOY_CLASSE_DISC."','".$date_maj."','".$date_maj."','".$millesime."'),
                               ('".$id_classe."','0','".$id_service_classe."','".$id_service_prof."','".$periode."','".$retour ["min"]."','".NOTE_MIN_CLASSE_DISC."','".$date_maj."','".$date_maj."','".$millesime."'),
		  	       ('".$id_classe."','0','".$id_service_classe."','".$id_service_prof."','".$periode."','".$retour ["max"]."','".NOTE_MAX_CLASSE_DISC."','".$date_maj."','".$date_maj."','".$millesime."')", $id_sql) ;
        }
      }
    }
   ElseIf ($id_discipline == -1)
    {
     // Vie scolaire
     $res = SQL_commande ("SELECT SUM(v.note),COUNT(v.note),MIN(v.note+0),MAX(v.note+0) FROM vie_scolaire v,classes c,eleves e WHERE c.id_classe='".$id_classe."' AND e.classe=c.id_classe AND v.eleve=e.id_eleve AND v.periode='".$periode."'", $id_sql) ;
     If (SQL_nbr_lignes ($res) == 1)
      {
       $r = SQL_ligne_suivante ($res) ;
       If ($r [1] > 0) { $retour ["moy"] = $r [0]/$r [1] ; }
       $retour ["min"] = $r [2] ;
       $retour ["max"] = $r [3] ;
       $retour ["total"] = $r [0] ;
       $retour ["nombre"] = $r [1] ;
      }
    }
   Return $retour ;
  }
 
 /**
 * Renvoie la moyenne, le minimum et le maximum d'une classe pour une discipline pour un professeur.
 * @param int $id_classe Id classe
 * @param int $id_discipline Id discipline
 * @param int $periode Numero de la periode
 * @param int $id_service_classe Id service classe
 * @param int $id_service_prof Id service prof
 * @param int $millesime Millesime
 * @return array ["moy"]=Moyenne, ["min"]=Minimum, ["max"]=Maximum ou code indiquant pourquoi il n'y a pas de note
 */
 Function stat_moy_classe ($id_classe, $id_discipline, $periode, $id_service_classe, $id_service_prof, $millesime)
  {
   Global $id_sql, $code_aucune_note, $code_pas_discipline, $code_absent, $code_dispense ;
   If (!$millesime) { $millesime = millesime (0) ; }
   For ($i = 0 ; $i < 3 ; $i++)
    {
     $table [$i] = $code_aucune_note ;
    }
   $smoy = SQL_commande ("SELECT DISTINCT valeur,type FROM moyennes WHERE eleve='".$id_classe."' AND controle='0' AND service_classe='".$id_service_classe."' AND service_prof='".$id_service_prof."' AND periode='".$periode."'
			     AND (type='".NOTE_MOY_CLASSE_DISC."' OR type='".NOTE_MIN_CLASSE_DISC."' OR type='".NOTE_MAX_CLASSE_DISC."') AND millesime='".$millesime."'", $id_sql) ;
   If (SQL_nbr_lignes ($smoy) == 3)
    {
     // C'est bon on recupere
     For ($i = 0 ; $i < 3 ; $i++)
      {
       $l = SQL_ligne_suivante ($smoy) ;
       Switch ($l [1])
        {
	 Case NOTE_MOY_CLASSE_DISC : $table ["moy"] = $l [0] ; Break ;
	 Case NOTE_MIN_CLASSE_DISC : $table ["min"] = $l [0] ; Break ;
	 Case NOTE_MAX_CLASSE_DISC : $table ["max"] = $l [0] ; Break ;
	}
      }
    }
   Else
    {
     // On a pas assez d'info donc on recalcul tout !
     $table = stats_disc ($id_classe, $id_discipline, $periode, $id_service_classe, $id_service_prof, $millesime) ;
    }
   Return $table ;
  }

 /**
 * Renvoi la moyenne, minimum, maximum et les appreciations de tous les eleves d'un service prof/classe
 * @param int $id_classe Id classe
 * @param int $periode Numero de la periode
 * @param int $id_discipline Identifiant discipline
 * @param int $id_service_prof Id service prof
 * @param int $id_service_classe Id service classe
 * @param int $id_prof identifiant enseignant
 * @param int $nombre_colonne Nombre de colonne des appreciations
 * @param int $millesime Millesime
 * @return array [0][0]=Nbr eleves, [0][1]=Mini Disc, [0][2]=Maxi Disc, [0][3]=Somme, [0][4]=Nombre, [0][5]=Moy Disc, [0][6]=option
 *               [$i][0]=Id eleve, [$i][1]=Type de note, [$i][2]=Moy eleve, [$i][3]=Nbr appreciations, [$i][3+$j]=Appreciation n°$j   
 */
 Function caracteristiques_discipline ($id_classe,$periode,$id_discipline,$id_service_prof,$id_service_classe,$id_prof,$nombre_colonne,$millesime)
  {
   Global $id_sql, $code_aucune_note, $code_dispense ;
   $t = eleves_par_service_classe ($id_service_prof) ;
   $nbr_periodes = nombre_periode ($id_classe) ;
   $table [0][0] = $t [0] ;
   $ok = 0 ;
   $total = $diviseur = 0 ;
   For ($i = 1 ; $i <= $t [0] ; $i++)
    {
     $table [$i][0] = $t [$i] ;
     // Stat eleve
     If ($periode <= $nbr_periodes) { $table [$i][2] = moyenne_el ($t [$i], $id_classe, $periode, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
     Else { $table [$i][2] = moyenne_annuelle ($t [$i], $id_classe, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
     If (Is_Numeric ($table [$i][2]))
      {
       $table [$i][1] = 1 ;
       If ($ok == 0) { $mini = $maxi = $table [$i][2] ; $ok = 1 ; }
       Else
        {
         If ($table [$i][2] < $mini) { $mini = $table [$i][2] ; }
         If ($table [$i][2] > $maxi) { $maxi = $table [$i][2] ; }
	}
       $total += $table [$i][2] ;
       $diviseur++ ;
      }
     ElseIf (($table [$i][2] == $code_dispense) Or ($table [$i][2] == $code_aucune_note)) { $table [$i][1] = -1 ; }
     Else { $table [$i][1] = -2 ; }
     // Appreciations
     $table [$i][3] = $nombre_colonne ;
     For ($j = 1 ; $j <= $nombre_colonne ; $j++)
      {
       $table [$i][3+$j] = appreciation ($t [$i], id_prof_par_id_service_prof ($id_service_prof), $id_discipline, $id_service_prof, $periode, $j) ;
      }
    }
   // Stat discipline
   If ($diviseur > 0)
    {
     $table [0][1] = $mini ;
     $table [0][2] = $maxi ;
     $table [0][3] = $total ;
     $table [0][4] = $diviseur ;
     $table [0][5] = $total/$diviseur ;
     $table [0][6] = estoptionnelle ($id_discipline, $id_classe, $id_service_classe) ;
    }
   Else { $table [0][1] = $table [0][2] = $table [0][3] = $table [0][4] = $table [0][5] = $code_aucune_note ; }
   Return $table ;
  }
 
 /**
 * Renvoi la moyenne, minimum, maximum et les appreciations de tous les eleves d'un service prof/classe
 * @param int $id_classe Id classe
 * @param int $periode_debut Numero de la periode debut
 * @param int $periode_fin Numero de la periode fin
 * @param int $periode_app Numero de la periode des appreciations
 * @param int $id_discipline Identifiant discipline
 * @param int $id_service_prof Id service prof
 * @param int $id_service_classe Id service classe
 * @param int $id_prof identifiant enseignant
 * @param int $nombre_colonne Nombre de colonne des appreciations
 * @param int $millesime Millesime
 * @return array [0][0]=Nbr eleves, [0][1]=Mini Disc, [0][2]=Maxi Disc, [0][3]=Somme, [0][4]=Nombre, [0][5]=Moy Disc, [0][6]=option
 *               [$i][0]=Id eleve, [$i][1]=Type de note, [$i][2]=Moy eleve, [$i][3]=Nbr appreciations, [$i][3+$j]=Appreciation n°$j   
 */
 Function caracteristiques_discipline_tranche ($id_classe,$periode_debut,$periode_fin,$periode_app,$id_discipline,$id_service_prof,$id_service_classe,$id_prof,$nombre_colonne,$millesime)
  {
   Global $id_sql, $code_aucune_note, $code_dispense ;
   $t = eleves_par_service_classe ($id_service_prof) ;
   $nbr_periodes = nombre_periode ($id_classe) ;
   $table [0][0] = $t [0] ;
   $ok = 0 ;
   $total = $diviseur = 0 ;
   For ($i = 1 ; $i <= $t [0] ; $i++)
    {
     $table [$i][0] = $t [$i] ;
     // Stat eleve
     $table [$i][2] = moyenne_tranche ($periode_debut, $periode_fin, $t [$i], $id_classe, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ;
     //If ($periode <= $nbr_periodes) { $table [$i][2] = moyenne_el ($t [$i], $id_classe, $periode, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
     //Else { $table [$i][2] = moyenne_annuelle ($t [$i], $id_classe, $id_discipline, $id_service_classe, $id_service_prof, 0, NOTE_MOY_ELEVE_DISC) ; }
     If (Is_Numeric ($table [$i][2]))
      {
       $table [$i][1] = 1 ;
       If ($ok == 0) { $mini = $maxi = $table [$i][2] ; $ok = 1 ; }
       Else
        {
         If ($table [$i][2] < $mini) { $mini = $table [$i][2] ; }
         If ($table [$i][2] > $maxi) { $maxi = $table [$i][2] ; }
	}
       $total += $table [$i][2] ;
       $diviseur++ ;
      }
     ElseIf (($table [$i][2] == $code_dispense) Or ($table [$i][2] == $code_aucune_note)) { $table [$i][1] = -1 ; }
     Else { $table [$i][1] = -2 ; }
     // Appreciations
     $table [$i][3] = $nombre_colonne ;
     For ($j = 1 ; $j <= $nombre_colonne ; $j++)
      {
       $table [$i][3+$j] = appreciation ($t [$i], id_prof_par_id_service_prof ($id_service_prof), $id_discipline, $id_service_prof, $periode_app, $j) ;
      }
    }
   // Stat discipline
   If ($diviseur > 0)
    {
     $table [0][1] = $mini ;
     $table [0][2] = $maxi ;
     $table [0][3] = $total ;
     $table [0][4] = $diviseur ;
     $table [0][5] = $total/$diviseur ;
     $table [0][6] = estoptionnelle ($id_discipline, $id_classe, $id_service_classe) ;
    }
   Else { $table [0][1] = $table [0][2] = $table [0][3] = $table [0][4] = $table [0][5] = $code_aucune_note ; }
   Return $table ;
  }
 
 /**
 * Retourne tableau (chaine) des notes, valeur max, examen, description de $eleve en $sp sur $periode
 * @param int $eleve Identifiant SQL eleve
 * @param int $sp Identifiant SQL du service prof
 * @param int $periode Numero de la periode
 * @return array Ensemble de notes et caracteristiques (Format : [0][0]=Nombre et [][1]=valeur,[][2]=max,[][3]=examen,[][4]=description,[][5]=coefficient)
 */
 Function notes_el_disc ($eleve, $sp, $periode)
  {
   Global $id_sql ;
   $retour = Array () ;
   $resultat = SQL_commande ("SELECT n.valeur,c.max,c.examen,c.description,c.coefficient FROM notes n, controles c
                               WHERE n.eleve='".$eleve."' AND n.controle=c.id_controle AND c.periode='".$periode."' AND c.service_prof='".$sp."' AND c.millesime='".millesime (0)."' ORDER BY date ", $id_sql) ;
   $i = 0 ;
   While ($ligne = SQL_ligne_suivante ($resultat))
    {
     $retour [$i][1] = $ligne [0] ;
     $retour [$i][2] = $ligne [1] ;
     $retour [$i][3] = $ligne [2] ;
     $retour [$i][4] = $ligne [3] ;
     $retour [$i][5] = $ligne [4] ;
     $i++ ;
    }
   $retour [0][0] = $i ;
   Return $retour ;
  }
 
 /**
 * Fonction realisant un test entre une condition et une valeur
 * @param mixed $valeur Valeur a comparer
 * @param mixed $extremum Valeur de comparaison
 * @param int $condition Identifiant de la comparaison a effecture (1=<,2=<=,3==,4=>,5=>=)
 * @param int $sens Sens de comparaison (0=Valeur par rapport a extremum,1=Extremum par rapport a valeur)
 * @return int 0=Condition non OK,1=Condition OK
 */
 Function test_conditionnel ($valeur, $extremum, $condition, $sens)
  {
   $ok = 0 ;
   If ($sens == 1) { $tempo = $valeur ; $valeur = $extremum ; $extremum = $tempo ; }
   Switch ($condition)
    {
     Case 1 : If ($extremum < $valeur) { $ok = 1 ; }
              Break ;
     Case 2 : If ($extremum <= $valeur) { $ok = 1 ; }
              Break ;
     Case 3 : If ($extremum = $valeur) { $ok = 1 ; }
              Break ;
     Case 4 : If ($extremum > $valeur) { $ok = 1 ; }
              Break ;
     Case 5 : If ($extremum >= $valeur) { $ok = 1 ; }
              Break ;
    }
   Return $ok ;
  }
 
 /**
 * Filtrage d'une appreciation comportant des champs de publipostage (discipline specifique)
 * @param string $appreciation Texte de l'appreciation a filtrer
 * @param int $id_eleve Identifiant de l'eleve
 * @param int $id_service_prof Identifiant du service professeur
 * @param int $periode Numero de la periode
 * @return string Appreciation filtree
 */
 Function filtrage_appreciation_disc_specifique ($appreciation, $id_eleve, $id_service_prof, $periode)
  {
   Global $id_sql ;
   $champs = SQL_commande ("SELECT code_champ,type FROM champs ORDER BY code_champ", $id_sql) ;
   $nbr_champs = SQL_nbr_lignes ($champs) ;
   If ($nbr_champs > 0)
    {
     $service_prof = SQL_commande ("SELECT * FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
     $sp = SQL_tableau_associatif ($service_prof, "") ;
     For ($i = 0 ; $i < $nbr_champs ; $i++)
      {
       $champ = SQL_ligne_suivante ($champs) ;
       While (Is_Numeric (StrPos ($appreciation, $champ [0])))
        {
	 Switch ((integer)$champ [1])
	  {
	   // Note eleve (si mono-note)
	   Case 1 : $appreciation = Str_Replace ($champ [0], moyenne_el ($id_eleve,$sp ["classe"],$periode,$sp ["discipline"],$sp ["service_classe"],$id_service_prof,0,0), $appreciation) ;
	            Break ;
	   // Moyenne eleve
	   Case 2 : $appreciation = Str_Replace ($champ [0], moyenne_el ($id_eleve,$sp ["classe"],$periode,$sp ["discipline"],$sp ["service_classe"],$id_service_prof,0,0), $appreciation) ;
	            Break ;
	   // Moyenne classe
	   Case 3 : 
	            Break ;
	   // Minimum classe
	   Case 4 : 
	            Break ;
	   // Maximum classe
	   Case 5 : 
	            Break ;
	   // Nom discipline long
	   Case 6 : $appreciation = Str_Replace ($champ [0], nom_discipline_long_par_id_service_prof ($id_service_prof), $appreciation) ;
	            Break ;
	   // Nom discipline court
	   Case 7 : $appreciation = Str_Replace ($champ [0], nom_discipline_court_par_id_service_prof ($id_service_prof), $appreciation) ;
	            Break ;
	   // Nom discipline bref
	   Case 8 : $appreciation = Str_Replace ($champ [0], nom_discipline_bref_par_id_service_prof ($id_service_prof), $appreciation) ;
	            Break ;
	  }
	}
      }
    }
   Return $appreciation ;
  }
 
 /**
 * Appreciations de $eleve dans $discipline pour $periode
 * @param int $eleve Identifiant SQL eleve
 * @param int $professeur Identifiant SQL enseignant
 * @param int $discipline Identifiant SQL discipline
 * @param int $serv_prof Identifiant SQL du service prof
 * @param int $periode Numero de la periode
 * @param int $colonne Numero de la colonne si multicolonne
 * @return string Texte de appreciation
 */
 Function appreciation ($eleve, $professeur, $discipline, $serv_prof, $periode, $colonne)
  {
   Global $id_sql ;
   // Alias ?
   $ok = SQL_commande ("SELECT professeur,classe,service_classe FROM services_prof WHERE id_service_prof='".$serv_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ok) == 1)
    {
     $alias = SQL_ligne_suivante ($ok) ;
     // Est-ce une discipline normale ou pas ?
     $disc = SQL_commande ("SELECT type_discipline FROM disciplines WHERE id_discipline='".$discipline."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($disc) == 1)
      {
       $dsc = SQL_ligne_suivante ($disc) ;
       If ($dsc [0] == 0)
        {
	 // Discipline Normale
         $requete = "SELECT texte FROM appreciations WHERE eleve='".$eleve."' AND discipline='".$discipline."' AND periode='".$periode."' " ;
         If (($alias [0] > 0) And ($alias [0] == $professeur)) { $requete .= "AND professeur='".$professeur."' " ; }
         Else
          {
           $resultats = SQL_commande ("SELECT id_utilisateur FROM groupes_alias WHERE code='1' AND id_alias='".(-$alias [0])."' ORDER BY numero", $id_sql) ;
           $nbr_res = SQL_nbr_lignes ($resultats) ;
           $requete .= "AND (" ;
           For ($i = 0 ; $i < $nbr_res ; $i++)
            {
    	     $lr = SQL_ligne_suivante ($resultats) ;
    	     If ($i > 0) { $requete .= " OR " ; }
    	     $requete .= "professeur='".$lr [0]."'" ;
    	    }
           $requete .= ") " ;
          }
         $requete .= "AND service_prof='".$serv_prof."'" ;
         If ($colonne > 0)
          {
           If ($colonne == 1) { $requete .= " AND (colonne='".$colonne."' OR colonne='0')" ; } Else { $requete .= " AND colonne='".$colonne."'" ; }
          }
         $requete .= " AND millesime='".millesime (0)."' LIMIT 1" ;
         $resultat = SQL_commande ($requete, $id_sql) ;
         If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return "" ; }
	}
       ElseIf ($dsc [0] == 3)
        {
	 // Discipline Specifique
	 $resultat = SQL_commande ("SELECT min,max,condition_1,condition_2,phrase FROM phrases_specifiques WHERE id_discipline='".$discipline."' ORDER BY min", $id_sql) ;
	 $moyenne = moyenne_el ($eleve, $alias [1], $periode, $discipline, $alias [2], $serv_prof, 0, 0) ;
	 $nbr_r = SQL_nbr_lignes ($resultat) ;
	 For ($i = 0 ; $i < $nbr_r ; $i++)
	  {
	   $r = SQL_ligne_suivante ($resultat) ;
	   $ok1 = test_conditionnel ($moyenne, $r [0], $r [2], 0) ;
	   $ok2 = test_conditionnel ($moyenne, $r [1], $r [3], 1) ;
	   If (($ok1 == 1) And ($ok2 == 1))
	    {
	     $phrase = $r [4] ;
	    }
	  }
	 //Return $phrase ;
	 Return filtrage_appreciation_disc_specifique ($phrase, $eleve, $serv_prof, $periode) ;
	}
      }	
     Else { Return "" ; }
    }
   Else { Return "" ; }
  }
 
 /**
 * Identifiant de l'appreciations de $eleve dans $discipline pour $periode
 * @param int $eleve Identifiant SQL eleve
 * @param int $professeur Identifiant SQL enseignant
 * @param int $discipline Identifiant SQL discipline
 * @param int $serv_prof Identifiant SQL du service prof
 * @param int $periode Numero de la periode
 * @param int $colonne Numero de la colonne si multicolonne
 * @return int Identifiant SQL de l'appreciation, 0 sinon
 */
 Function appreciation_id ($eleve, $professeur, $discipline, $serv_prof, $periode, $colonne)
  {
   Global $id_sql ;
   // Alias ?
   $ok = SQL_commande ("SELECT professeur FROM services_prof WHERE id_service_prof='".$serv_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ok) == 1)
    {
     $alias = SQL_ligne_suivante ($ok) ;
     $requete = "SELECT id_appreciation FROM appreciations WHERE eleve='".$eleve."' AND discipline='".$discipline."' AND periode='".$periode."' " ;
     If (($alias [0] > 0) And ($alias [0] == $professeur)) { $requete .= "AND professeur='".$professeur."' " ; }
     Else
      {
       $resultats = SQL_commande ("SELECT id_utilisateur FROM groupes_alias WHERE code='1' AND id_alias='".(-$alias [0])."' ORDER BY numero", $id_sql) ;
       $nbr_res = SQL_nbr_lignes ($resultats) ;
       $requete .= "AND (" ;
       For ($i = 0 ; $i < $nbr_res ; $i++)
        {
	 $lr = SQL_ligne_suivante ($resultats) ;
	 If ($i > 0) { $requete .= " OR " ; }
	 $requete .= "professeur='".$lr [0]."'" ;
	}
       $requete .= ") " ;
      }
     $requete .= " AND service_prof='".$serv_prof."'" ;
     If ($colonne > 0)
      {
       If ($colonne == 1) { $requete .= " AND (colonne='".$colonne."' OR colonne='0')" ; } Else { $requete .= " AND colonne='".$colonne."'" ; }
      }
     $requete .= " AND millesime='".millesime (0)."' LIMIT 1" ;
     $resultat = SQL_commande ($requete, $id_sql) ;
     If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
    }
   Else { Return 0 ; }
  }

 /**
 * Permet de savoir si une colonne d'appreciation particuliere a ete utilisee
 * @param int $colonne Numero de la colonne si multicolonne
 * @return int 0=Non utilise,1=Utilise
 */
 Function colonne_appreciation_existe ($colonne)
  {
   Global $id_sql ;
   If ($colonne > 0)
    {
     $resultat = SQL_commande ("SELECT id_appreciation FROM appreciations WHERE colonne='".$colonne."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
     If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
    }
   Else { Return 0 ; } 
  }
 
 /**
 * Renvoi le nom d'une colonne d'appreciation particuliere
 * @param int $num_colonne Numero de la colonne si multicolonne
 * @param int $id_etablissement Identifiant de l'etablissement
 * @return string Nom de la colonne
 */
 Function nom_colonne_appreciation ($num_colonne, $id_etablissement)
  {
   Global $id_sql ;
   If ($num_colonne > 0)
    {
     $nom = restaure_configuration ("SYSTEME_PARAM", "SAISIE_MULTIPLE_".$id_etablissement, "NOM_COLONNE_".$num_colonne) ;
     Return $nom ;
    }
   Else { Return "Appr&eacute;ciations" ; } 
  }
 
 /**
 * Appreciations de l'equipe pedagogique de $eleve pour $periode
 * @param int $id_eleve Identifiant SQL eleve
 * @param int $id_classe Identifiant SQL classe
 * @param int $periode Numero de la periode
 * @return string Texte de appreciation
 */
 Function appreciation_equipe_pedagogique ($id_eleve, $id_classe, $periode)
  {
   Global $id_sql ;
   $ok = SQL_commande ("ALTER TABLE appreciations CHANGE professeur professeur INT(11) DEFAULT '0' NOT NULL", $id_sql) ;
   $resultat = SQL_commande ("SELECT texte FROM appreciations WHERE eleve='".$id_eleve."' AND classe='".$id_classe."' AND periode='".$periode."' AND professeur='-1' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return StripSlashes ($ligne [0]) ; } Else { Return "" ; }
  }
 
 /**
 * Saisie appreciations de l'equipe pedagogique de $eleve pour $periode
 * @param int $id_eleve Identifiant SQL eleve
 * @param int $id_classe Identifiant SQL classe
 * @param int $periode Numero de la periode
 * @param string $texte Texte de l'appreciation
 * @return boolean Indique si l'ecriture s'est bien passee
 */
 Function ecriture_appreciation_equipe_pedagogique ($id_eleve, $id_classe, $periode, $texte)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   //$ok = SQL_commande ("ALTER TABLE appreciations CHANGE professeur professeur INT(11) DEFAULT '0' NOT NULL", $id_sql) ;
   //$ok = SQL_commande ("DELETE from appreciations WHERE eleve='".$id_eleve."' AND classe='".$id_classe."' AND periode='".$periode."' AND professeur='-1' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   $ok = SQL_commande ("SELECT id_appreciation from appreciations WHERE eleve='".$id_eleve."' AND classe='".$id_classe."' AND periode='".$periode."' AND professeur='-1' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ok) == 1)
    {
     $ok1 = SQL_ligne_suivante ($ok) ;
     $ok = SQL_commande ("UPDATE appreciations SET eleve='".$id_eleve."',classe='".$id_classe."',periode='".$periode."',texte='".$texte."',professeur='-1',millesime='".$millesime."',colonne='0'
                           WHERE id_appreciation='".$ok1 [0]."' LIMIT 1", $id_sql) ;
    }
   Else
    {
     $ok = SQL_commande ("INSERT INTO appreciations (eleve,classe,periode,texte,professeur,colonne,millesime) VALUES ('".$id_eleve."','".$id_classe."','".$periode."','".$texte."','-1','0','".$millesime."')", $id_sql) ;
    }
   If ($ok) { Return True ; } Else { Return False ; }
  }
 
 /**
 * Renvoi le coefficient de calcul de la discipline vie scolaire
 * @param int $id_classe Identifiant de la classe
 * @return double Coefficient numerique
 */
 Function coefficient_discipline_vie_scolaire ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT coefficient_vs FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
  }
 
 /**
 * Renvoi l'identifiant du CPE
 * @param int $id_classe Identifiant de la classe
 * @return int Identifiant CPE si existe sinon 0
 */
 Function id_cpe_par_id_classe ($id_classe)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT u.id_utilisateur FROM utilisateurs u,classes c WHERE c.id_classe='".$id_classe."' AND c.cpe=u.id_utilisateur LIMIT 1", $id_sql) ;
   If ($ligne = SQL_ligne_suivante ($resultat)) { Return $ligne [0] ; } Else { Return 0 ; }
  }

 // ===============================================================================
 //  GESTION HTML
 // -------------------------------------------------------------------------------
 /**
 * Formulaire de saisie de date
 * @param int $j Jour courant
 * @param int $m Mois courant
 * @param int $a Annee courante
 * @param int $debut Premiere annee
 * @param int $taille Nombre d'annees
 * @param string $var_jour Nom de la variable pour le jour
 * @param string $var_mois Nom de la variable pour le mois
 * @param string $var_annee Nom de la variable pour l'annee
 * @return string $f Chaine formattee contenant le formulaire
 */
 Function saisie_date ($j, $m, $a, $debut, $taille, $var_jour, $var_mois, $var_annee)
  {
   Global $nom_mois_maj ;
   $f = "" ;
   $f .= "<select name=\"".$var_jour."\">" ;
   For ($i = 1 ; $i <= 31 ; $i++)
    {
     $f .= "<option value=\"" ;
     If ($i < 10) $f .= "0" ;
     $f .= $i."\"" ;
     If ($i == $j) { $f .= " selected" ; }
     $f .= ">".$i."</option>" ;
    }
   $f .= "</select>&nbsp;" ;
   $f .= "<select name=\"".$var_mois."\">" ;
   For ($i = 1 ; $i <= 12 ; $i++)
    {
     $f .= "<option value=\"" ;
     If ($i < 10) $f .= "0" ;
     $f .= $i."\"" ;
     If ($i == $m) { $f .= " selected" ; }
     $f .= ">".$nom_mois_maj [$i]."</option>" ;
    }
   $f .= "</select>&nbsp;" ;
   $f .= "<select name=\"".$var_annee."\">" ;
   For ($i = $debut ; $i <= $debut+$taille; $i++)
    {
     $f .= "<option value=\"" ;
     If ($i < 10) $f .= "0" ;
     $f .= $i."\"" ;
     If ($i == $a) { $f .= " selected" ; }
     $f .= ">".$i."</option>" ;
    }
   $f .= "</select>" ;
   Return $f;
  }
 
 /**
 * Formulaire de saisie de date avec regroupement des annees pour une annee scolaire uniquement
 * @param int $j Jour courant
 * @param int $m_a Mois et Annee courante format YYYY-MM
 * @param int $premier_mois Numero du premier mois de l'annee scolaire
 * @param int $millesime Millesime
 * @param string $var_jour Nom de la variable pour le jour
 * @param string $var_mois_annee Nom de la variable pour le mois et l''annee
 * @return string $f Chaine formattee contenant le formulaire
 */
 Function saisie_date_regroupement ($j, $m_a, $premier_mois, $millesime, $var_jour, $var_mois_annee)
  {
   Global $nom_mois_maj ;
   $f = "" ;
   $f .= "<select name=\"".$var_jour."\">" ;
   For ($i = 1 ; $i <= 31 ; $i++)
    {
     $f .= "<option value=\"" ;
     If ($i < 10) $f .= "0" ;
     $f .= $i."\"" ;
     If ($i == $j) { $f .= " selected" ; }
     $f .= ">".$i."</option>" ;
    }
   $f .= "</select>&nbsp;" ;
   $f .= "<select name=\"".$var_mois_annee."\">" ;
   For ($i = $premier_mois ; $i <= 12 ; $i++)
    {
     $f .= "<option value=\"" ;
     $valeur = $millesime."-" ;
     If ($i < 10) { $valeur .= "0" ; }
     $valeur .= $i ;
     $f .= $valeur."\"" ;
     If ($valeur == $m_a) { $f .= " selected" ; }
     $f .= ">".$nom_mois_maj [$i]." ".$millesime."</option>" ;
    }
   For ($i = 1 ; $i < $premier_mois ; $i++)
    {
     $f .= "<option value=\"" ;
     $valeur = ($millesime+1)."-" ;
     If ($i < 10) { $valeur .= "0" ; }
     $valeur .= $i ;
     $f .= $valeur."\"" ;
     If ($valeur == $m_a) { $f .= " selected" ; }
     $f .= ">".$nom_mois_maj [$i]." ".($millesime+1)."</option>" ;
    }
   $f .= "</select>" ;
   Return $f;
  }

 /**
 * Formulaire de saisie d'une heure
 * @param int $h Heure courante
 * @param int $m Minute courante
 * @param int $s Seconde courante
 * @param int $deb_h Heure de debut
 * @param int $fin_h Heure de fin
 * @param int $deb_m Minute de debut
 * @param int $fin_m Minute de fin
 * @param int $deb_s Secondes de debut
 * @param int $fin_s Secondes de fin
 * @param string $var_heure Nom de la variable pour l'heure
 * @param string $var_minute Nom de la variable pour les minutes
 * @param string $var_seconde Nom de la variable pour les secondes
 * @return string $f Chaine formattee contenant le formulaire
 */
 Function saisie_heure ($h, $m, $s, $deb_h, $fin_h, $deb_m, $fin_m, $deb_s, $fin_s, $var_heure, $var_minute, $var_seconde)
  {
   $f = "" ;
   If ($deb_h >= 0)
    {
     $f .= "<select name=\"".$var_heure."\">" ;
     For ($i = $deb_h ; $i <= $fin_h ; $i++)
      {
       $f .= "<option value=\"" ;
       If ($i < 10) $f .= "0" ;
       $f .= $i."\"" ;
       If ($i == $h) { $f .= " selected" ; }
       $f .= ">".$i."</option>" ;
      }
     $f .= "</select>H" ;
    }
   Else
    {
     $f .= "<input type=\"hidden\" name=\"".$var_heure."\" value=\"00\">" ;
    }
   If ($deb_m >= 0)
    {
     $f .= "<select name=\"".$var_minute."\">" ;
     For ($i = $deb_m ; $i <= $fin_m ; $i++)
      {
       $f .= "<option value=\"" ;
       If ($i < 10) $f .= "0" ;
       $f .= $i."\"" ;
       If ($i == $m) { $f .= " selected" ; }
       $f .= ">".$i."</option>" ;
      }
     $f .= "</select>" ;
    }
   Else
    {
     $f .= "<input type=\"hidden\" name=\"".$var_minute."\" value=\"00\">" ;
    }
   If ($deb_s >= 0)
    {
     $f .= "m<select name=\"".$var_seconde."\">" ;
     For ($i = $deb_s ; $i <= $fin_s ; $i++)
      {
       $f .= "<option value=\"" ;
       If ($i < 10) $f .= "0" ;
       $f .= $i."\"" ;
       If ($i == $s) $f .= " selected" ;
       $f .= ">".$i."</option>" ;
      }
     $f .= "</select>" ;
    }
   Else
    {
     $f .= "<input type=\"hidden\" name=\"".$var_seconde."\" value=\"00\">" ;
    }
   Return $f ;
  }

 /**
 * Recherche des couleurs des notes pour affichage
 * @param int $id_classe Identifiant de la classe
 * @param int $code_session Identifiant de session courante
 * @param string $identifiant Identifiant de connexion (login)
 * @return array Tableau contenant les intervalles de couleurs
 */
 Function couleurs_notes ($id_classe, $code_session, $identifiant)
  {
   Global $id_sql, $note_par_defaut ;
   If ($id_classe > 0)
    {
     $gestion = SQL_commande ("SELECT e.max FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
     $gst = SQL_ligne_suivante ($gestion) ;
    }
   Else { $gst [0] = $note_par_defaut ; }
   $ut = SQL_commande ("SELECT utilisateur FROM sessions WHERE id_session='".$code_session."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ut) == 1)
    {
     $u = SQl_ligne_suivante ($ut) ;
     // Existe-t-il des couleurs personnalisees ?
     $cp = SQL_commande ("SELECT indice,valeur FROM configuration WHERE identification='PROF_".$u [0]."' AND nom='COUL_NOTE_".$id_classe."' AND millesime='".millesime (0)."' ORDER BY indice", $id_sql) ;
     If (SQL_nbr_lignes ($cp) == 0)
      {
       $cp = SQL_commande ("SELECT indice,valeur FROM configuration WHERE identification='PROF_".$u [0]."' AND nom='COUL_NOTE_0' AND millesime='".millesime (0)."' ORDER BY indice", $id_sql) ;
       If (SQL_nbr_lignes ($cp) == 0) { $non_ok = 1 ; } Else { $non_ok = 0 ; }
      }
     Else { $non_ok = 0 ; }
     If ($non_ok == 0)
      {
       // Ok
       $couleurs [0][0] = SQL_nbr_lignes ($cp) ;
       For ($i = 1 ; $i <= $couleurs [0][0] ; $i++)
        {
         $clp = SQL_ligne_suivante ($cp) ;
         $couleurs [$i][0] = $clp [0]*$gst [0] ; // Intervalle
         $couleurs [$i][1] = $clp [1] ; // Couleur
        }
      }
    }
   Else
    {
     // L'utilisateur non trouve dans la session ???
     $non_ok = 1 ;
    }
   If ($non_ok == 1)
    {
     // Couleurs par defaut
     $couleurs [0][0] = 3 ; // Nombre de couleurs
     $couleurs [1][0] = 0.4*$gst [0] ; // Intervalle 1 : de 0 a 40%MAX
     $couleurs [1][1] = "#ff0000" ; // Couleur rouge
     $couleurs [2][0] = 0.6*$gst [0] ; // Intervalle 2 : de 40%MAX a 60%MAX
     $couleurs [2][1] = "#e6872f" ; // Couleur orange
     $couleurs [3][0] = $gst [0] ; // Intervalle 3 :de 60%MAX a 100%MAX
     $couleurs [3][1] = "#2f9709" ; // Couleur vert
    }
   Return $couleurs ;
  }

 /**
 * Affichage d'une cellule
 * @param string $couleur Couleur du fond de la cellule
 * @param string $titre Titre a mettre en commentaire
 * @param int $taille Hauteur des caracteres
 * @param string $note Note a afficher
 * @param int $c 0:Decomposition note couleur defaut, 1:Decomposition avec couleur $c_car, 2:Une cellule avec couleur defaut, 3:Une cellule avec couleur $c_car
 * @param string $c_car Couleur de la note si $c==1
 * @param array $cn Couleurs des notes en fontion de l'intervalle
 * @param int $vm Valeur maximale
 * @return string HTML d'affichage
 */
 Function affiche_note ($couleur, $titre, $taille, $note, $c, $c_car, $cn, $vm)
  {
   Global $id_sql ;
   $ligne = "" ;
   $note = Str_Replace (",",".",$note) ;
   If (($p = StrPos ($note, "(")) Or ($p = StrPos ($note, "[")) Or ($p = StrPos ($note, "%")))
    {
     $suppl = SubStr ($note, $p, StrLen ($note)-$p) ;
     $note = SubStr ($note, 0, $p) ;
    }
   If ($c < 2)
    {
     $ligne .= "<td bgcolor=\"".$couleur."\">&nbsp;</td>" ;
     If ($c == 0)
      {
       $i = 1 ;
       $ok = 0 ;
       If ($cn [$cn [0][0]][0] != 0) { $coefficient = $vm/$cn [$cn [0][0]][0] ; } Else { $coefficient = 1 ; }
       While (($i < $cn [0][0]) And ($ok == 0))
        {
         If ($note < $coefficient*$cn [$i][0]) { $c_car = $cn [$i][1] ; $ok = 1 ; }
         $i++ ;
        }
       If ($ok == 0) { $c_car = $cn [$i][1] ; }
      }
     If (StrPos ($note, "."))
      {
       $ligne .= "<td align=\"right\" bgcolor=\"".$couleur."\"><font size=\"".$taille."\" color=\"".$c_car."\">&nbsp;" ;
       $ligne .= "<b title=\"".$titre."\">".SubStr ($note, 0, StrPos ($note, "."))."</b></font></td>" ;
       $ligne .= "<td align=\"left\" bgcolor=\"".$couleur."\"><font size=\"".$taille."\" color=\"".$c_car."\"><b title=\"".$titre."\">,</b></font></td>" ;
       $ligne .= "<td align=\"left\" bgcolor=\"".$couleur."\"><font size=\"".$taille."\" color=\"".$c_car."\">" ;
       $ligne .= "<b title=\"".$titre."\">".SubStr ($note, StrPos ($note, ".")+1, StrLen ($note))."</b>&nbsp;</font></td>" ;
       $ligne .= "<td bgcolor=\"".$couleur."\"><font size=\"".$taille."\">&nbsp;</font>" ; If ($suppl) { $ligne .= "&nbsp;".$suppl ; }
       $ligne .= "</td>" ;
      }
     Else
      {
       $ligne .= "<td align=\"right\" bgcolor=\"".$couleur."\"><font size=\"".$taille."\" color=\"".$c_car."\">&nbsp;<b title=\"".$titre."\">".$note."</b></font></td>" ;
       $ligne .= "<td colspan=\"3\" bgcolor=\"".$couleur."\">" ; If ($suppl) { $ligne .= "&nbsp;".$suppl ; } Else { $ligne .= "<font size=\"".$taille."\">&nbsp;</font>" ; }
       $ligne .= "</td>" ;
      }
    }
   Else
    {
     If ($c == 2)
      {
       $i = 1 ;
       $ok = 0 ;
       If ($cn [$cn [0][0]][0] != 0) { $coefficient = $vm/$cn [$cn [0][0]][0] ; } Else { $coefficient = 1 ; }
       While (($i < $cn [0][0]) And ($ok == 0))
        {
         If ($note < $coefficient*$cn [$i][0]) { $c_car = $cn [$i][1] ; $ok = 1 ; }
         $i++ ;
        }
       If ($ok == 0) { $c_car = $cn [$i][1] ; }
      }
     $ligne .= "<td align=\"center\" bgcolor=\"".$couleur."\"><font size=\"".$taille."\" color=\"".$c_car."\">&nbsp;<b title=\"".$titre."\">" ;
     If (StrPos ($note, ".")) { $ligne .= Str_Replace (".",",",$note) ; } Else { $ligne .= $note ; }
     $ligne .= "</b></font>" ; If ($suppl) { $ligne .= "&nbsp;".$suppl ; }
     $ligne .= "</td>" ;
    }
   Return $ligne ;
  }
 /**
 * Renvoi la couleur opposee
 * @param string $couleur Couleur dont on veut avoir l'opposee format RRGGBB ou #RRGGBB
 * @return string Couleur opposee format RRGGBB ou #RRGGBB
 */
 Function couleur_opposee ($couleur)
  {
   If (SubStr ($couleur, 0, 1) == "#") { $plus = "#" ; $couleur = SubStr ($couleur, 1, StrLen ($couleur)-1) ; } Else { $plus = "" ; }
   $r = DecHex (255 - HexDec (SubStr ($couleur, 0, 2))) ;
   $r = (StrLen ($r) > 1) ? $r : '0'.$r ;
   $g = DecHex (255 - HexDec (SubStr ($couleur, 2, 2))) ;
   $g = (StrLen ($g) > 1) ? $g : '0'.$g ;
   $b = DecHex (255 - HexDec (SubStr ($couleur, 4, 2))) ;
   $b = (StrLen ($b) > 1) ? $b : '0'.$b ;
   Return $plus.$r.$g.$b ;
  }
 
 /**
 * Insertion de l'entete PAGES
 */
 Function entete_page ($type_document, $type_encodage)
  {
   Global $navigateur_type_doc, $navigateur_type_codage ;
   $chaine = "" ;
   If ($type_document != "") { $navigateur_type_doc = $type_document ; }
   If ($type_encodage != "") { $navigateur_type_codage = $type_encodage ; }
   If ($navigateur_type_doc > 3) { $chaine = "<?xml version=\"1.0\" encoding=\"".$navigateur_type_codage."\" ?>" ; }
   Switch ($navigateur_type_doc)
    {
     // HTML Frames
     Case 1 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">" ; Break ;
     // HTML Balises non recommandees et sans frames
     Case 2 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" ; Break ;
     // HTML Respect strictement les regles du W3C
     Case 3 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" ; Break ;
     // XHTML Frames
     Case 4 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">" ; Break ;
     // XHTML Balises non recommandees et sans frames
     Case 5 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" ; Break ;
     // XHTML Respect strictement les regles du W3C
     Case 6 : $chaine .= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">" ; Break ;
    }
   Return $chaine ;
  }
  
 /**
 * Insertion de l'entete HTML
 * @param string $titre Titre de la page courante
 * @param string $cible Cible des pointages FORM
 * @param int $fin_session Numero de fin de session (0 : aucune ; 1 : courante)
 */
 Function entete_html ($titre, $cible, $fin_session)
  {
   Global $http_garennes, $page_sortie, $droit_courant, $duree_deux_messages, $nombre_messages, $fenetre, $droit_courant, $droit_cpe ;
   Global $repertoire_racine, $theme, $l, $navigateur_type_codage ;
   If ((integer)$duree_deux_messages < 30) { $duree_deux_messages = 30 ; }
   If ((integer)$nombre_messages < 1) { $nombre_messages = 3 ; }
   // Destruction des fichiers temporaires
   If (IsSet ($repertoire_racine))
    {
     If (File_Exists ($repertoire_racine."tmp/f".Session_Id ().".pdf")) { @Unlink ($repertoire_racine."tmp/f".Session_Id ().".pdf") ; }
     If (File_Exists ($repertoire_racine."tmp/f".Session_Id ().".csv")) { @Unlink ($repertoire_racine."tmp/f".Session_Id ().".csv") ; }
     If (File_Exists ($repertoire_racine."tmp/f".Session_Id ())) { @Unlink ($repertoire_racine."tmp/f".Session_Id ()) ; }
    }
   Echo "<meta name=\"expires\" content=\"Sun, 2 Jan 2000 00:00:00 GMT\">" ;
   Echo "<meta http-equiv=\"pragma\" content=\"no-cache\" />" ;
   Echo "<meta http-equiv=\"content-language\" content=\"fr\">" ;
   If ($titre == "") { $titre = "Garennes." ; }
   Echo "<title>".$titre."</title>" ;
   Echo "<meta name=\"description\" content=\"Gestion des résultats scolaires.\">" ;
   Echo "<meta name=\"author\" content=\"Jean-François Campan\">" ;
   Echo "<meta name=\"author\" content=\"Jean-Denis Chadozeau\">" ;
   Echo "<meta name=\"author\" content=\"Yves Ouvrard\">" ;
   Echo "<meta http-equiv=\"Content-Type\" content=\"text/html; Charset=".$navigateur_type_codage."\" />" ;
   Echo "<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\">" ;
   Echo "<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">" ;
   Echo "<meta http-equiv=\"Reply-to\" content=\"jean-francois.campan@ac-poitiers.fr\">" ;
   Echo "<meta http-equiv=\"Reply-to\" content=\"yves.ouvrard@collatinus.com\">" ;
   Echo "<link rel=\"shortcut icon\" href=\"".$http_garennes."images/icone.ico\">" ;
   Echo "<link rel=\"icon\" href=\"".$http_garennes."images/icone_animee.gif\" type=\"image/gif\" />" ;
   // Styles
   Echo "<style type=\"text/css\"> " ;
   Echo "body{color:#000000;font-family:Arial,sans-serif,Helvetica;font-size:10pt;text-decoration:none;}" ;
   Echo "a:{display:block;}" ;
   If (($droit_courant < $droit_cpe) And ($theme [0][3] != ""))
    {
     Echo "#entree{border:1px solid ".$theme [0][5].";padding-left:2px;background:".$theme [0][3]."}" ;
     Echo "#entree:hover,#entree:active,#entree:focus{border-color:".$theme [0][29].";background:#FFFFFF}" ;
     Echo "select{border:0px solid ".$theme [0][5].";padding-left:2px;background:".$theme [0][3]."}" ;
     Echo "select:hover,select:active,select:focus{border-color:".$theme [0][29].";background:#FFFFFF}" ;
    }
   ElseIf ($l ["couleur_fond"] != "")
    {
     Echo "#entree_normale{border:1px solid ".$l ["couleur_fond"].";background:".$l ["couleur_fond"]."}" ;
     Echo "#entree_surbrillance{border:1px solid ".$l ["nom"].";background:".$l ["nom"]."}" ;
     Echo "#entree_normale:hover,#entree_normale:active,#entree_normale:focus," ;
     Echo "#entree_surbrillance:hover,#entree_surbrillance:active,#entree_surbrillance:focus{border:1px solid ".$l ["lien"].";background:#ffffff}" ;
     Echo "select{border:1px solid #000000;}" ;
     //Echo "select{border:0px solid #000000;padding-left:2px;background:".$l ["couleur_fond"]."}" ;
     //Echo "select:hover,select:active,select:focus{border-color:".$l [].";background:#FFFFFF}" ;
    }
   // Opacite a 100% de la page principale.
   Echo "body.gar001{opacity:1;" ; // Compatible avec Safari et Mozilla.
   Echo "filter:alpha(opacity=100);" ; // Compatible avec Microsoft Explorer.
   Echo "}" ;
   // Opacite a 30% de la page principale.
   Echo "body.gar002{opacity:.3;" ; // Compatible avec Safari et Mozilla.
   Echo "filter:alpha(opacity=30);" ; // Compatible avec Microsoft Explorer.
   Echo "}" ;
   // Opacite a 100% d'un element
   Echo ".gar101{opacity:1;" ; // Compatible avec Safari et Mozilla.
   Echo "filter:alpha(opacity=100);" ; // Compatible avec Microsoft Explorer.
   Echo "}" ;
   // Opacite a 30% d'un element.
   Echo ".gar102{opacity:.3;" ; // Compatible avec Safari et Mozilla.
   Echo "filter:alpha(opacity=30);" ; // Compatible avec Microsoft Explorer.
   Echo "}" ;
   // Police petite
   Echo "#petit{font-family:Arial,sans-serif,Helvetica;font-size:9pt;text-decoration:none;}" ;
   // Bords
   Echo "#bords_ext{border:1px solid #000000;padding:0px}" ;
   
   Echo "#bords_aucun{border:0px solid #000000;padding:0px}" ;
   Echo "#bords_h{border-top:1px solid #000000;}" ;
   Echo "#bords_b{border-bottom:1px solid #000000;}" ;
   Echo "#bords_g{border-left:1px solid #000000;}" ;
   Echo "#bords_d{border-right:1px solid #000000;}" ;
   
   Echo "#bords_hb{border-top:1px solid #000000;border-bottom:1px solid #000000;}" ;
   Echo "#bords_hg{border-top:1px solid #000000;border-left:1px solid #000000;}" ;
   Echo "#bords_hd{border-top:1px solid #000000;border-right:1px solid #000000;}" ;
   
   Echo "#bords_hgd{border-top:1px solid #000000;border-left:1px solid #000000;border-right:1px solid #000000;}" ;
   Echo "#bords_hbg{border-top:1px solid #000000;border-bottom:1px solid #000000;border-left:1px solid #000000;}" ;
   Echo "#bords_hbd{border-top:1px solid #000000;border-bottom:1px solid #000000;border-right:1px solid #000000;}" ;
   
   Echo "#bords_bg{border-bottom:1px solid #000000;border-left:1px solid #000000;}" ;
   Echo "#bords_bd{border-bottom:1px solid #000000;border-right:1px solid #000000;}" ;
   Echo "#bords_bgd{border-bottom:1px solid #000000;border-left:1px solid #000000;border-right:1px solid #000000;}" ;
   
   Echo "#bords_gd{border-left:1px solid #000000;border-right:1px solid #000000;}" ;
   
   Echo "</style>" ;
   If ($cible != "") { Echo "<base target=\"".$cible."\">" ; }
   If ((integer)$fenetre == 1) { Echo "<script language=\"JavaScript\" type=\"text/JavaScript\">window.focus();</script>" ; }
   If ($fin_session == 1)
    {
     $rs = renseignements_session () ;
     If ($duree_deux_messages <= 0) { $duree_deux_messages = 30 ; }
     $duree_messages = $nombre_messages*$duree_deux_messages ;
     $duree_restante_minute = Round ($duree_messages/60) ;
     If ($rs [2] < $duree_messages) { $rs [2] = $duree_messages+$duree_deux_messages+$duree_deux_messages-1 ; }
     If ((integer)$fenetre == 0)
      {
       $nom_fonction = "inactivite_".Rand () ;
       //Echo "<meta http-equiv=\"refresh\" content=\"".$rs [2].";url='".$http_garennes."sortie.php?erreur=1'\">" ;
       Echo "<script language=\"JavaScript\" type=\"text/JavaScript\">" ;
       Echo "var nbr_m=".$nombre_messages.";" ;
       Echo "var num_m=0;" ;
       Echo "var fen_ouverte=0;" ;
       Echo "var gar_fen=0;" ;
       Echo "var fen=0;" ;
       Echo "var debut=new Date();" ;
       Echo "var ref=".$rs [2].";" ;
       Echo "var avant_alerte=".$duree_messages.";" ;
       Echo "var delai=".$duree_deux_messages.";" ;
       Echo "function ".$nom_fonction."()" ;
       Echo "{" ;
       //echo "alert(window.fenetre);";
       Echo  "if(fen_ouverte==0 && fen==0)";
       Echo   "{" ;
       Echo    "var actuel=new Date();" ;
       Echo    "var duree=Math.ceil((ref-(actuel-debut)/1000)/60);" ;
       Echo    "num_m++;" ;
       Echo    "if (num_m<=nbr_m)" ;
       Echo     "{" ;
       Echo      "var h=actuel.getHours();" ;
       Echo      "var m=actuel.getMinutes();" ;
       Echo      "var s=actuel.getSeconds();" ;
       Echo      "var heure=h+\"H\"+m+\"m\"+s+\" \";" ;
       Echo      "setTimeout(\"".$nom_fonction."()\",delai*1000);" ;
       Echo      "if (num_m<nbr_m)" ;
       Echo       "{" ;
       Echo        "if(duree>1){mess='minutes'}else{mess='minute'}" ;
       Echo        "alert(\"Message \"+num_m+\"/\"+nbr_m+\"\\nA \"+heure+\", il vous reste moins de \"+duree+\" \"+mess+\"" ;
       Echo        " d'inactivité avant d'être deconnecté\\nSi vous ne faites aucune action, votre travail sera perdu !\")" ;
       Echo       "}" ;
       Echo      "else" ;
       Echo       "{" ;
       Echo        "if(delai>1){mess='secondes'}else{mess='seconde'}" ;
       Echo        "alert(\"DERNIER MESSAGE AVANT DÉCONNEXION\\nA \"+heure+\", il vous reste \"+delai+\" \"+mess+\"" ;
       Echo        " d'inactivité avant d'être déconnecté\\nSi vous ne faites aucune action, votre travail sera perdu !\");" ;
       Echo       "}" ;
       Echo     "}" ;
       Echo    "else" ;
       Echo     "{window.open ('".$page_sortie."?erreur=1','_top','')}" ;
       Echo   "}" ;
       Echo  "else if(fen_ouverte==1){num_m=0;fen_ouverte=0;fen=1;setTimeout(\"".$nom_fonction."()\",1000)}" ;
       Echo  "else{fen=0;fen_ouverte=0;debut=new Date();setTimeout(\"".$nom_fonction."()\",(ref-avant_alerte)*1000)}" ;
       Echo "}" ;
       Echo "setTimeout(\"".$nom_fonction."()\",".(($rs [2]-$duree_messages)*1000).")" ;
       Echo "</script>" ;
      }
     ElseIf ((integer)$fenetre == 1)
      {
       //Echo "<meta http-equiv=\"refresh\" content=\"".$rs [2].";url='".$http_garennes."sortie.php?erreur=1'\">" ;
       Echo "<script language=\"JavaScript\" type=\"text/JavaScript\">" ;
       Echo "var nbr_m=".$nombre_messages.";" ;
       Echo "var num_m=0;" ;
       Echo "var debut=new Date();" ;
       Echo "var ref=".($rs [2]*1000).";" ;
       Echo "var avant_alerte=".(($rs [2]-$duree_messages)*1000).";" ;
       Echo "var delai=".($duree_deux_messages*1000).";" ;
       Echo "function etat_fenetre()" ;
       Echo "{" ;
       Echo  "opener.fen_ouverte=1;" ;
       Echo  "var actuel=new Date();" ;
       Echo  "var d=actuel-debut;" ;
       Echo  "if(d>=(avant_alerte+num_m*delai))" ;
       Echo   "{" ;
       //Echo    "alert(\"ref=\"+ref+\"-actuel=\"+actuel+\"-debut=\"+debut+\"\\nactuel-debut=\"+(actuel-debut)+\"-d=\"+d+\"-calcul=\"+(avant_alerte+num_m*delai));" ;
       Echo    "num_m++;" ;
       Echo    "if (num_m<=nbr_m)" ;
       Echo     "{" ;
       Echo      "setTimeout(\"etat_fenetre()\",100);" ;
       Echo      "var h=actuel.getHours();" ;
       Echo      "var m=actuel.getMinutes();" ;
       Echo      "var s=actuel.getSeconds();" ;
       Echo      "var heure=h+\"H\"+m+\"m\"+s+\" \";" ;
       Echo      "var duree=Math.ceil((ref-(actuel-debut))/60000);" ;
       Echo      "if (num_m<nbr_m)" ;
       Echo       "{" ;
       Echo        "if(duree>1){mess='minutes'}else{mess='minute'}" ;
       Echo        "alert(\"Message \"+num_m+\"/\"+nbr_m+\"\\nA \"+heure+\", il vous reste moins de \"+duree+\" \"+mess+\"" ;
       Echo        " d'inactivit� avant d'�tre d�connect�.\\nSi vous ne faites aucune action, votre travail sera perdu !\")" ;
       Echo       "}" ;
       Echo      "else" ;
       Echo       "{" ;
       Echo        "if(delai>1){mess='secondes'}else{mess='seconde'}" ;
       Echo        "alert(\"DERNIER MESSAGE AVANT D�CONNEXION\\nA \"+heure+\", il vous reste \"+delai+\" \"+mess+\"" ;
       Echo        " d'inactivit� avant d'�tre d�connect�.\\nSi vous ne faites aucune action, votre travail sera perdu !\");" ;
       Echo       "}" ;
       Echo      "self.focus();" ;
       Echo     "}" ;
       Echo    "else" ;
       Echo     "{window.open ('".$page_sortie."?erreur=1&fenetre=1&droit_courant=".$droit_courant."','_top','')}" ;
       Echo   "}" ;
       Echo  "else" ;
       Echo   "{" ;
       Echo    "setTimeout(\"etat_fenetre()\",100);" ;
       Echo   "}" ;
       Echo "}" ;
       Echo "setTimeout(\"etat_fenetre()\",100);" ;
       Echo "</script>" ;
      } 
    }
   ElseIf ((integer)$fenetre == 1)
    {
     Echo "<script language=\"JavaScript\" type=\"text/JavaScript\">" ;
     Echo "function etat_fenetre()" ;
     Echo "{" ;
     Echo "opener.fen_ouverte=1;" ;
     Echo "setTimeout(\"etat_fenetre()\",100);" ;
     Echo "}" ;
     Echo "setTimeout(\"etat_fenetre()\",100);" ;
     Echo "</script>" ;
    } 
  }

 /**
 * Insertion d'une fonction de patience de chargement de la page
 * @param string $message Titre de la page courante
 * @param string $coul_bord Couleur du bord de la fenetre
 * @param string $coul_fond Couleur du fond de la fenetre
 * @return string HTML du code de patience
 */
 Function faire_patienter ($message, $coul_bord, $coul_fond)
  {
   $nom_element = "garennes_patience" ;
   $ligne = "<div style=\"position:absolute;visibility:hidden;z-index:2\" id=\"".$nom_element."\">" ;
   $ligne .= "<br><table bgcolor=\"".$coul_bord."\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"400\"" ;
   $ligne .= " style=\"-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;" ;
   $ligne .= "border:1px solid ".$coul_bord."\">" ;
   $ligne .= "<tbody><tr><td align=\"center\" valign=\"middle\">" ;
   $ligne .= "<table bgcolor=\"".$coul_fond."\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"" ;
   $ligne .= " style=\"-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px;-moz-border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;border:1px solid #ffffff\">" ;
   $ligne .= "<tbody><tr><td align=\"center\" valign=\"middle\"><br>&nbsp;".$message."&nbsp;<br>&nbsp;" ;
   $ligne .= "</td></tr></tbody></table></td></tr></tbody></table></div>" ;
   $ligne .= "<script language=\"JavaScript\">" ;
   $ligne .= "var nava=(document.layers);" ;
   $ligne .= "var dom=(document.getElementById);" ;
   $ligne .= "var iex=(document.all);" ;
   $ligne .= "if(nava){c=document.patience}" ;
   $ligne .= "else if(dom){c=document.getElementById(\"".$nom_element."\").style}" ;
   $ligne .= "else if(iex){c=".$nom_element.".style}" ;
   $ligne .= "largeur=screen.width;" ;
   $ligne .= "hauteur=screen.height;" ;
   $ligne .= "if(largeur>800){c.left=Math.round((largeur/2)-400)+\"px\";}else{c.left=\"50px\";}" ;
   $ligne .= "if(hauteur>800){c.top=Math.round((hauteur/2)-400)+\"px\";}else{c.top=\"50px\";}" ;
   $ligne .= "c.visibility=\"visible\";" ;
   $ligne .= "function cache_patience(){c.visibility=\"hidden\";}" ;
   $ligne .= "window.onload=cache_patience" ;
   $ligne .= "</script>" ;
   Return $ligne ;
  }
 
 /**
 * Renvoi le singulier, le pluriel et la forme simple d'un intitule
 * @param string $nom_champs Nom du champ a traiter dans la bdd
 * @param string $valeur_defaut Valeur par defaut si n'existe pas
 * @return array Tableau contenant dans l'ordre (forme simple,forme au singulier,forme au pluriel)
 */
 Function intitule_titre_affichage ($nom_champs, $valeur_defaut, $millesime)
  {
   Global $id_sql ;
   $etabl = SQL_commande ("SELECT * FROM etablissements WHERE millesime='".$millesime."' ORDER BY numero,nom", $id_sql) ;
   $param_etab [0][0] = SQL_nbr_lignes ($etabl) ;
   For ($i = 1 ; $i <= $param_etab [0][0] ; $i++)
    {
     $param_etab [$i] = SQL_tableau_associatif ($etabl, "") ;
    }
   $num = 0 ;
   For ($i = 1 ; $i <= $param_etab [0][0] ; $i++)
    {
     $temp = restaure_configuration_defaut ("SYSTEME_PARAM","AFFICHAGE","INTITULE_".$nom_champs."_".$param_etab [$i]["id_etablissement"], $valeur_defaut) ;
     $ok = 1 ;
     For ($j = 0 ; $j < $num ; $j++)
      {
       If ($nom_disc [$j] == $temp) { $ok = 0 ; }
      }
     If ($ok == 1) { $nom_disc [$num] = $temp ; $num++ ; }
    }
   $titre = "" ;
   For ($i = 0 ; $i < $num ; $i++)
    {
     $e = Explode ("|", $nom_disc [$i]) ;
     If ($i > 0) { $titre_sing .= "/" ; $titre_plur .= "/" ; $titre_simple .= "/" ; }
     If ($e [0] == 0) { $titre_sing .= "un&nbsp;" ; } Else { $titre_sing .= "une&nbsp;" ; }
     $titre_sing .= $e [1] ;
     $titre_simple .= $e [1] ;
     $titre_plur .= $e [2] ;
    }
   Return Array ($titre_simple,$titre_sing,$titre_plur) ;
  }
 
 /**
 * Generation d'un mot de passe prononcable
 * @return string Mot de passe
 */
 Function passe_mnemo ()
  {
   If (func_num_args() == 1) { $nb = func_get_arg(0) ; } Else { $nb = 8 ; }
   // on utilise certains chiffres : 1 = i, 5 = S, 6=b, 3=E, 9=G, 0=O
   $lettre = Array () ;
   $lettre[0] = Array ('a','b','c','d','e','f','g','h','i','j','k','l','m','o','n','p','q','r','s','t','u','v','w','x','y','z',
                       'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','D','S','T','U','V','W','X','Y','Z',
		       '9','0','6','5','1','3') ;
   $lettre[1] = Array ('a','e','i','o','u','y','A','E','I','O','U','Y','1','3','0') ;
   $lettre[-1] = Array ('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','z',
                        'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z',
                        '5','6','9') ;
   $retour = "" ;
   $prec = 1 ;
   $precprec = -1 ;
   SRand ((double)microtime()*20001107) ;
   While (StrLen ($retour) < $nb)
    {
     // pour genere la suite de lettre, on dit : si les deux lettres sont
     // des consonnes (resp. des voyelles)  on affiche des voyelles (resp, des consonnes).
     // si les lettres sont de type differents, on affiche une lettre de l'alphabet
     $type = ($precprec + $prec)/2 ;
     $r = $lettre [$type][array_rand ($lettre [$type], 1)] ;
     $retour .= $r ;
     $precprec = $prec ;
     $prec = in_array ($r, $lettre [-1]) - in_array ($r, $lettre [1]) ;
    }
   Return $retour ;
  }

 /**
 * Fonction de cryptage sommaire (pour transmission internet)
 * @param string $mot Mot a crypter
 * @param string $clef Clef de cryptage
 * @return string Mot crypte
 */
 Function cryptage_sommaire ($mot, $clef)
  {
   $longueur = 3 ;
   If ($clef == "") { $clef = "jfc" ; }
   
   $chaine .= Str_Repeat ("0", $longueur) ;
   $cryptage = "" ;
   For ($i = 0 ; $i < StrLen ($mot) ; $i++)
    {
     $lettre = Ord ($mot [$i]) ;
     //$cryptage .= $chaine."|" ;
     //$cryptage .= $lettre." ^ ".Ord ($clef [$i%StrLen ($clef)])."=" ;
     $c = $lettre ^ Ord ($clef [$i%StrLen ($clef)]) ; 
     $cryptage .= SubStr ($chaine, 0, $longueur-StrLen ($c)).$c ;
     //$cryptage .= "|" ;
    }
   $s = 0 ;
   For ($i = 0 ; $i < StrLen ($cryptage) ; $i++)
    {
     $s += (integer)SubStr ($cryptage, $i, 1) ;
    }
   $cryptage .= SubStr ($chaine, 0, $longueur-StrLen ($s)).$s ;
   Return $cryptage ;
  }
 
 /**
 * Style de la frame
 * @param string $l_d Couleur du texte du lien
 * @param string $a_d Couleur du texte du lien actif
 * @param string $v_d Couleur du texte du lien visite
 * @param string $h_f Couleur de fond du lien parcouru
 * @param string $h_d Couleur du texte du lien parcouru
 * @return string HTML du style utilise
 */
 Function styles ($l_d, $a_d, $v_d, $h_f, $h_d)
  {
   Global $droit_courant, $droit_admin ;
   $police = restaure_configuration ("SYSTEME_PARAM","GENERAL","POLICE") ;
   $taille_normale = restaure_configuration ("SYSTEME_PARAM","GENERAL","TAILLE_POLICE_NORMALE") ;
   $taille_h1 = restaure_configuration ("SYSTEME_PARAM","GENERAL","TAILLE_POLICE_H1") ;
   If ($police == "") { $police = "Arial,sans-serif" ; sauvegarde_configuration ("SYSTEME_PARAM","GENERAL","POLICE", $police) ; }
   If ($taille_normale == "") { $taille_normale = 10 ; sauvegarde_configuration ("SYSTEME_PARAM","GENERAL","TAILLE_POLICE_NORMALE", $taille_normale) ; }
   If ($taille_h1 == "") { $taille_h1 = 16 ; sauvegarde_configuration ("SYSTEME_PARAM","GENERAL","TAILLE_POLICE_h1", $taille_h1) ; }
   $style  = "<style type=\"text/css\">" ;
   $style .= "a:link{text-decoration:".$l_d.";font-family:".$police.";cursor:pointer;}" ;
   $style .= "a:active{text-decoration:".$a_d.";font-family:".$police.";cursor:pointer;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px}" ;
   $style .= "a:visited{text-decoration:".$v_d.";font-family:".$police.";cursor:pointer}" ;
   $style .= "a:hover{background-color:".$h_f.";text-decoration:".$h_d.";font-family:".$police.";cursor:pointer;}" ;
   $style .= "body{margin:0px;padding:0;left:0;top:0;width:auto;font:normal normal ".$taille_normale."pt ".$police.";}" ;
   $style .= "hr.header{clear:both;width:100%;padding:0;margin:0;}" ;
   $style .= "h1{font:normal small-caps ".$taille_h1."pt ".$police.";line-height:300%;letter-spacing:2px;text-align:center;}" ;
   $style .= "input,submit,p,td,li,ul{font:normal ".$taille_normale."pt ".$police.";}" ;
   $style .= "textarea{font:normal ".$taille_normale."pt ".$police.";}" ;
   $style .= "td.cn{font-size:".$taille_normale."pt;}" ;
   $style .= "table.col{border-collapse:collapse;border-spacing:0;border:1px solid #000000;}" ;
   $style .= "td.col{font-size:".$taille_normale."pt;border-left:1px solid #000000;border-right:1px solid #000000;}" ;
   $style .= ".bold{font-weight:bold;font-style: normal;}" ;
   Switch ($droit_courant)
    {
     Case $droit_admin : $style .= "table.encadre{border-collapse:collapse;border-spacing:0;" ;
                         $style .= "border-left:1px solid #000000;border-top:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;}" ;
                         $style .= "td.milieu{border-bottom:0px;}" ;
                         Break ;
    }
   $style .= "</style>" ;
   Return $style ;
  }

 /**
 * Affichage du message lors d'une mise a jour ou insertion...
 * @param string $message Numero de message a afficher
 * @param array $rapport Rapport de verification (si existe : $rapport [0] > 0)
 */
 Function affiche_message ($message, $rapport)
  {
   If (($message) Or (Is_Array ($rapport) And ($rapport [0] > 0)))
    {
     Echo "<div name=\"message\"><center>" ;
     If (Is_Numeric ($message))
      {
       If ($message > 0)
        {
         Echo "<font color=\"#FF0000\"><blink><b>" ;
         Switch ($message)
          {
            Case 1 : Echo "Modification effectu&eacute;e !" ; Break ;
  	    Case 2 : Echo "Mise &agrave; jour effectu&eacute;e !" ; Break ;
	    Case 3 : Echo "&Eacute;tat de la v&eacute;rification" ; Break ;
	    Case 4 : Echo "Ajout effectu&eacute; !" ; Break ;
	    Case 5 : Echo "Probl&egrave;me d'ajout : Contactez l'administrateur !" ; Break ;
	    Case 6 : Echo "Supression effectu&eacute;e !" ; Break ;
	    Case 7 : Echo "Probl&egrave;me de suppression : Contactez l'administrateur !" ; Break ;
	    Case 8 : Echo "D&eacute;j&agrave; existant !" ; Break ;
	    Case 9 : Echo "Champs non complets !" ; Break ;
	   Case 10 : Echo "Probl&egrave;me de mise &agrave; jour : Non existant dans la base de donn&eacute;es !" ; Break ;
           Default : Echo "Modification effectu&eacute;e !" ; Break ;
          }
	}
       Echo "</b></blink></font>" ;
      }
     Else { Echo "<font color=\"#FF0000\"><b>".$message."</b></font>" ; }	
     If (Is_Array ($rapport) And ($rapport [0] > 0))
      {
       Echo "<br><textarea cols=\"80\" rows=\"" ;
       If ($rapport [0] < 6) { Echo ($rapport [0]+1) ; } Else { Echo "5" ; }
       Echo "\" style=\"border:1px dashed #000000;\">".$rapport [1]."</textarea>" ;
      }
     Echo "</center></div>" ;
    }
  }

 /**
 * Formattage du nom et prenom eleve avec sortie HTML ou texte
 * @param string $nom Nom de l'eleve
 * @param string $prenoms Prenoms de l'eleve
 * @param int $f_nom Type de formattage du nom (0=NOM/1=Nom/2=<b>NOM</b>/3=<b>Nom</b>/4=<i>NOM</i>/5=<i>Nom</i>/6=<b><i>NOM</i></b>/7=<b><i>Nom</i></b>)
 * @param int $f_prenom Type de formattage du prenom (voir f_nom pour les modes)
 * @param int $sortie Mode de sortie (0=HTML/1=texte)
 * @return string Formattage
 */
 Function formatte_nom_eleve ($nom, $prenoms, $f_nom, $f_prenom, $sortie)
  {
   If (StrPos ($prenoms, " ") > 0) { $prenom = SubStr ($prenoms, 0, StrPos ($prenoms, " ")) ; }
   Else { $prenom = $prenoms ; }
   Switch ($f_nom)
    {
     Case 0 : Case 2 : Case 4 : Case 6 : $nom = StrToUpper ($nom) ; Break ;
     Case 1 : Case 3 : Case 5 : Case 7 : If (StrPos ($nom, " ") Or StrPos ($nom, "-"))
                                          {
					   $car = "" ;
					   If (StrPos ($nom, " ")) { $n = Explode (" ", $nom) ; $car = " " ; }
					   Else { $n = Explode ("-", $nom) ; $car = "-" ; }
					   If (SizeOf ($n) > 0)
					    {
					     $nom = "" ;
					     For ($i = 0 ; $i < SizeOf ($n) ; $i++)
					      {
					       If ($i > 0) { $nom .= $car  ; }
					       $nom .= StrToUpper (SubStr ($n [$i],0,1)).StrToLower (SubStr ($n [$i],1,StrLen ($n [$i])-1)) ;
					      }
					    }
					   Else { $nom = StrToUpper (SubStr ($nom,0,1)).StrToLower (SubStr ($nom,1,StrLen ($nom)-1)) ; }
					  }
					 Else { $nom = StrToUpper (SubStr ($nom,0,1)).StrToLower (SubStr ($nom,1,StrLen ($nom)-1)) ; }
					 Break ;
    }
   Switch ($f_prenom)
    {
     Case 0 : Case 2 : Case 4 : Case 6 : $prenom = StrToUpper ($prenom) ; Break ;
     Case 1 : Case 3 : Case 5 : Case 7 : If (StrPos ($prenom, "-"))
                                          {
					   $p = Explode ("-", $prenom) ;
					   $prenom = "" ;
					   For ($i = 0 ; $i < SizeOf ($p) ; $i++)
					    {
					     If ($i > 0) { $nom .= "-"  ; }
					     $prenom .= StrToUpper (SubStr ($p [$i],0,1)).StrToLower (SubStr ($p [$i],1,StrLen ($p [$i])-1)) ;
					    }
					  }
					 Else { $prenom = StrToUpper (SubStr ($prenom,0,1)).StrToLower (SubStr ($prenom,1,StrLen ($prenom)-1)) ; }
					 Break ;
    }
   If ($sortie == 0)
    {
     $espace = "&nbsp;" ;
     Switch ($f_nom)
      {
       Case 2 : Case 3 : $nom = "<b>".$nom."</b>" ; Break ;
       Case 4 : Case 5 : $nom = "<i>".$nom."</i>" ; Break ;
       Case 6 : Case 7 : $nom = "<b><i>".$nom."</b></i>" ; Break ;
      }
     Switch ($f_prenom)
      {
       Case 2 : Case 3 : $prenom = "<b>".$prenom."</b>" ; Break ;
       Case 4 : Case 5 : $prenom = "<i>".$prenom."</i>" ; Break ;
       Case 6 : Case 7 : $prenom = "<b><i>".$prenom."</b></i>" ; Break ;
      }
    } Else { $espace = " " ; }
   Return Str_Replace (" ",$espace,$nom).$espace.Str_Replace (" ",$espace,$prenom) ;
  }

 /**
 * Purge l'ensemble de la base de donnees
 * @param string $d Espace a positionner au debut du tableau (A ELIMINER)
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function purger ($d, $ch, $cf, $tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   // Efface les services prof sans relation
   $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($services_prof) ; $i++)
    {
     $sp = SQL_tableau_associatif ($services_prof, "") ;
     $services_classe = SQL_commande ("SELECT id_service_classe FROM services_classe WHERE id_service_classe='".$sp ["service_classe"]."'" , $id_sql) ;
     If (SQL_nbr_lignes ($services_classe) == 0)
      {
       If ($sp ["groupe_classe"] > 0)
        {
         $groupes_classe = SQL_commande ("SELECT id_groupe_classe FROM services_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1" , $id_sql) ;
	 If (SQL_nbr_lignes ($groupes_classe) > 0)
          {
	   $ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1", $id_sql) ;
	  }
        }
       $ok = SQL_commande ("DELETE FROM services_prof WHERE id_service_prof='".$sp ["id_service_prof"]."' LIMIT 1", $id_sql) ;
      }
    }

   // Efface les services classe sans relation
   $services_classe = SQL_commande ("SELECT * FROM services_classe WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($services_classe) ; $i++)
    {
     $sc = SQL_tableau_associatif ($services_classe, "") ;
     $services_prof = SQL_commande ("SELECT id_service_prof FROM services_prof WHERE service_classe='".$sc ["id_service_classe"]."' AND millesime='".$millesime."'" , $id_sql) ;
     If (SQL_nbr_lignes ($services_prof) == 0)
      {
       $ok = SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$sc ["id_service_classe"]."' LIMIT 1", $id_sql) ;
      }
    }

   $l  = $d."<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= $d."<tr bgcolor=\"".$ch."\">" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Enseignant&nbsp;</font></td>" ;
   $l .= $d."</tr>" ;
   $compteur = 0 ;
   $classes = SQL_commande ("SELECT * FROM classes WHERE millesime='".$millesime."' ORDER BY nom_bref", $id_sql) ;
   For ($j = 0 ; $j < SQL_nbr_lignes ($classes) ; $j++)
    {
     $cl = SQL_tableau_associatif ($classes, "") ;
     $disciplines = SQL_commande ("SELECT * FROM disciplines WHERE millesime='".$millesime."' ORDER BY nom_court", $id_sql) ;
     $nbr_d = SQL_nbr_lignes ($disciplines) ;
     For ($i = 0 ; $i < $nbr_d ; $i++)
      {
       $disc = SQL_tableau_associatif ($disciplines, "") ;
       $services_classe = SQL_commande ("SELECT * FROM services_classe
                                         WHERE classe='".$cl ["id_classe"]."' AND code_classe='".$cl ["nom_bref"]."'
				  	   AND discipline='".$disc ["id_discipline"]."' AND code_disc='".$disc ["code"]."'
					   AND optionnelle='0' AND millesime='".$millesime."' ORDER BY groupe", $id_sql) ;
       $sc = SQL_tableau_associatif ($services_classe, "") ;
       If ((SQL_nbr_lignes ($services_classe) >= 2) And ($sc ["groupe"] == 0))
        {
         $sc = SQL_tableau_associatif ($services_classe, "") ;
         $services_prof = SQL_commande ("SELECT * FROM services_prof
                                         WHERE classe='".$cl ["id_classe"]."' AND code_classe='".$cl ["nom_bref"]."'
					   AND discipline='".$disc ["id_discipline"]."' AND code_disc='".$disc ["code"]."'
					   AND service_classe='".$sc ["id_service_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
	 $nbr_sp = SQL_nbr_lignes ($services_prof) ;
         If ($nbr_sp > 0)
          {
	   For ($k = 1 ; $k <= $nbr_sp ; $k++)
	    {
	     $sp = SQL_tableau_associatif ($services_prof, "") ;
	     $efface [$k][0] = $sp ["groupe_classe" ] ;
	     $efface [$k][1] = $sp ["is_service_prof" ] ;
	     $efface [$k][2] = $sp ["sous_discipline" ] ;
	     $efface [$k][3] = 0 ;
	     $efface [$k][4] = $sp ["service_classe" ] ;
	    }
	   $efface [0][0] = $k ;
	   For ($k = 1 ; $k <= $efface [0][0]-1 ; $k++)
	    {
	     For ($ll = $k + 1 ; $ll <= $efface [0][0] ; $ll++)
	      {
	       If ($efface [$k][2] == $efface [$ll][2]) { $efface [$k][3]++ ; $efface [$ll][3]++ ; }
	      }
	    }
	   For ($k = 1 ; $k <= $efface [0][0] ; $k++)
	    {
	     If ($efface [$k][3])
	      {
	       $compteur++ ;
	       //$sp = SQL_tableau_associatif ($services_prof, "") ;
	       //$ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."'", $id_sql) ;
	       //$ok = SQL_commande ("DELETE FROM services_prof WHERE id_service_classe='".$sp ["id_service_prof"]."'", $id_sql) ;
	       $ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$efface [$k][0]."'", $id_sql) ;
	       $ok = SQL_commande ("DELETE FROM services_prof WHERE id_service_classe='".$sp [$k][1]."'", $id_sql) ;
	       //echo "DELETE FROM groupes_classe WHERE id_groupe_classe='".$efface [$k][0]."'<br>" ;
	       //echo "DELETE FROM services_prof WHERE id_service_classe='".$sp [$k][1]."'<br>" ;
	       $ok = SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$efface [$k][4]."'", $id_sql) ;
	       //echo "DELETE FROM services_classe WHERE id_service_classe='".$efface [$k][4]."'<br>" ;
	       $util = SQL_commande ("SELECT nom,prenom FROM utilisateurs WHERE numen='".$sp ["numen_prof"]."'", $id_sql) ;
	       $u = SQL_ligne_suivante ($util) ;
	       $l .= $d."<tr>" ;
               $l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$cl ["nom"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
               $l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
               $l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$u [0]."&nbsp;".$u [1]."&nbsp;</font></td>" ;
               $l .= $d."</tr>" ;
	      }
	    }
	   //SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$sc ["id_service_classe"]."'", $id_sql) ;
	   //$util = SQL_commande ("SELECT nom,prenom FROM utilisateurs WHERE numen='".$sp ["numen_prof"]."'", $id_sql) ;
	   //$u = SQL_ligne_suivante ($util) ;
	   //$l .= $d."<tr>" ;
           //$l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$cl ["nom"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
           //$l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
           //$l .= $d."<td align=CENTER><font size=\"".$tf."\">&nbsp;".$u [0]."&nbsp;".$u [1]."&nbsp;</font></td>" ;
           //$l .= $d."</tr>" ;
	  }
         Else
          {
	   $l .= $d."<tr>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl ["nom_court"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Aucun service prof correspondant !&nbsp;</font></td>" ;
           $l .= $d."</tr>" ;
	  }
        }
       $services_classe = SQL_commande ("SELECT * FROM services_classe
                                         WHERE classe='".$cl ["id_classe"]."' AND code_classe='".$cl ["nom_bref"]."'
				  	   AND discipline='".$disc ["id_discipline"]."' AND code_disc='".$disc ["code"]."'
					   AND optionnelle='1' AND millesime='".$millesime."' ORDER BY groupe", $id_sql) ;
       $sc = SQL_tableau_associatif ($services_classe, "") ;
       If ((SQL_nbr_lignes ($services_classe) >= 2) And ($sc ["groupe"] == 0))
        {
         $sc = SQL_tableau_associatif ($services_classe, "") ;
         $services_prof = SQL_commande ("SELECT * FROM services_prof
                                         WHERE classe='".$cl ["id_classe"]."' AND code_classe='".$cl ["nom_bref"]."'
					   AND discipline='".$disc ["id_discipline"]."' AND code_disc='".$disc ["code"]."'
					   AND service_classe='".$sc ["id_service_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
	 $compteur++ ;
         If (SQL_nbr_lignes ($services_prof) > 0)
          {
	   For ($k = 0 ; $k < SQL_nbr_lignes ($services_prof) ; $k++)
	    {
	     $sp = SQL_tableau_associatif ($services_prof, "") ;
	     $ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."'", $id_sql) ;
	     $ok = SQL_commande ("DELETE FROM services_prof WHERE id_service_classe='".$sp ["id_service_prof"]."'", $id_sql) ;
	    }
	   $ok = SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$sc ["id_service_classe"]."'", $id_sql) ;
	   $util = SQL_commande ("SELECT nom,prenom FROM utilisateurs WHERE numen='".$sp ["numen_prof"]."'", $id_sql) ;
	   $u = SQL_ligne_suivante ($util) ;
	   $l .= $d."<tr>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl ["nom"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$u [0]."&nbsp;".$u [1]."&nbsp;</font></td>" ;
           $l .= $d."</tr>" ;
	  }
         Else
          {
	   $l .= $d."<tr>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl ["nom_court"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Aucun service prof correspondant !&nbsp;</font></td>" ;
           $l .= $d."</tr>" ;
	  }
        }
      }
    }
   If ($compteur == 0)
    {
     $l  = $d."<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
     $l .= $d."<tr>" ;
     $l .= $d."<td align=\"center\" colspan=\"3\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;d&eacute;j&agrave;&nbsp;purg&eacute;e&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= $d."</tr>" ;
    }
   $l .= $d."</table>" ;
   Return $l ;
  }
 
 /**
 * Optimisation de la base des options
 * @param string $d Espace a positionner au debut du tableau (A ELIMINER)
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function purger_options ($d, $ch, $cf, $tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   $l  = $d."<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= $d."<tr bgcolor=\"".$ch."\">" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;Option&nbsp;</font></td>" ;
   $l .= $d."</tr>" ;
   $compteur = 0 ;
   $classes = SQL_commande ("SELECT * FROM classes WHERE millesime='".$millesime."' ORDER BY nom_bref", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($classes) ; $i++)
    {
     $cl = SQL_tableau_associatif ($classes, "") ;
     $disciplines = SQL_commande ("SELECT * FROM disciplines WHERE millesime='".$millesime."' ORDER BY nom_court", $id_sql) ;
     For ($j = 0 ; $j < SQL_nbr_lignes ($disciplines) ; $j++)
      {
       $disc = SQL_tableau_associatif ($disciplines, "") ;
       $services_classe = SQL_commande ("SELECT * FROM services_classe
                                          WHERE classe='".$cl ["id_classe"]."' AND code_classe='".$cl ["nom_bref"]."'
				  	    AND discipline='".$disc ["id_discipline"]."' AND code_disc='".$disc ["code"]."'
					    AND optionnelle='1' AND groupe='0' AND millesime='".$millesime."'", $id_sql) ;
       For ($k = 0 ; $k < SQL_nbr_lignes ($services_classe) ; $k++)
        {
         $sc = SQL_tableau_associatif ($services_classe, "") ;
         $groupes_classe = SQL_commande ("SELECT g.code_groupe, p.id_service_prof
	                                    FROM groupes_classe g, services_prof p, services_classe s
                                           WHERE g.classe='".$cl ["id_classe"]."' AND g.code_classe='".$cl ["nom_bref"]."'
					     AND g.discipline='".$disc ["id_discipline"]."' AND g.code_disc='".$disc ["code"]."'
					     AND g.id_groupe_classe=p.groupe_classe AND p.classe='".$cl ["id_classe"]."'
					     AND p.code_classe='".$cl ["nom_bref"]."' AND p.discipline='".$disc ["id_discipline"]."'
					     AND p.code_disc='".$disc ["code"]."' AND p.service_classe=s.id_service_classe AND p.millesime='".$millesime."'", $id_sql) ;
         If (SQL_nbr_lignes ($groupes_classe) == 1)
          {
	   $compteur++ ;
	   $gc = SQL_tableau_associatif ($groupes_classe, "") ;
	   SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$gc ["id_groupe_classe"]."'", $id_sql) ;
	   SQL_commande ("UPDATE services_classe SET groupe='0' WHERE id_service_classe='".$sc ["id_service_classe"]."'", $id_sql) ;
	   SQL_commande ("UPDATE services_prof SET groupe_classe='0' WHERE id_service_prof='".$gc ["id_service_prof"]."'", $id_sql) ;
	   $l .= $d."<tr>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl ["nom"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>" ;
           $l .= $d."<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$gc ["code_groupe"]."&nbsp;</font></td>" ;
           $l .= $d."</tr>" ;
	  }
        }
       //$disc = SQL_tableau_associatif ($disciplines, "") ;
       //$services_classe = SQL_commande ("SELECT * FROM services_classe
        //                                 WHERE classe='".$cl ["id_classe"]."'
	//			           AND code_classe='".$cl ["nom_bref"]."'
	//			  	   AND discipline='".$disc ["id_discipline"]."'
	//			    	   AND code_disc='".$disc ["code"]."'
	//				   AND optionnelle='0' AND groupe='1'", $id_sql) ;
       //For ($k = 0 ; $k < SQL_nbr_lignes ($services_classe) ; $k++)
        //{
        // $sc = SQL_tableau_associatif ($services_classe, "") ;
        // $groupes_classe = SQL_commande ("SELECT g.code_groupe, p.id_service_prof
	//                                    FROM groupes_classe g, services_prof p, services_classe s
        //                                   WHERE g.classe='".$cl ["id_classe"]."'
	//			             AND g.code_classe='".$cl ["nom_bref"]."'
	//				     AND g.discipline='".$disc ["id_discipline"]."'
	//				     AND g.code_disc='".$disc ["code"]."'
	//				     AND g.id_groupe_classe=p.groupe_classe
	//				     AND p.classe='".$cl ["id_classe"]."'
	//				     AND p.code_classe='".$cl ["nom_bref"]."'
	//				     AND p.discipline='".$disc ["id_discipline"]."'
	//				     AND p.code_disc='".$disc ["code"]."'
	//				     AND p.service_classe=s.id_service_classe", $id_sql) ;
        // If (SQL_nbr_lignes ($groupes_classe) == 1)
        //  {
	//   $compteur++ ;
	//   $gc = SQL_tableau_associatif ($groupes_classe, "") ;
	//   SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$gc ["id_groupe_classe"]."'", $id_sql) ;
	//   SQL_commande ("UPDATE services_classe
	//                     SET groupe='0'  WHERE id_service_classe='".$sc ["id_service_classe"]."'", $id_sql) ;
	//   SQL_commande ("UPDATE services_prof
	//                     SET groupe_classe='0' WHERE id_service_prof='".$gc ["id_service_prof"]."'", $id_sql) ;
	//   $l .= $d." <tr>\n" ;
        //   $l .= $d."  <td align=CENTER><font size=\"".$tf."\">&nbsp;".$cl ["nom"]."&nbsp;(".$cl ["nom_bref"].")&nbsp;</font></td>\n" ;
        //   $l .= $d."  <td align=CENTER><font size=\"".$tf."\">&nbsp;".$disc ["nom_long"]."&nbsp;</font></td>\n" ;
        //   $l .= $d."  <td align=CENTER><font size=\"".$tf."\">&nbsp;".$gc ["code_groupe"]."&nbsp;</font></td>\n" ;
        //   $l .= $d." </tr>\n" ;
	//  }
        //}
      }
    }
   If ($compteur == 0)
    {
     $l  = $d."<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
     $l .= $d."<tr>" ;
     $l .= $d."<td align=\"center\" colspan=\"3\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;d&eacute;j&agrave;&nbsp;purg&eacute;e&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= $d."</tr>" ;
    }
   $l .= $d."</table>" ;
   Return $l ;
  }
 
 
 /**
 * Teste de coherence de la base des options
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function coherence_options ($ch, $cf, $tf)
  {
   Global $id_sql, $debug_SQL ;
   $millesime = millesime (0) ;
   $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
   $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"4\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;options&nbsp;et&nbsp;des&nbsp;groupes&nbsp;de&nbsp;classe.&nbsp;</td></tr>" ;
   $l .= "<tr bgcolor=\"".$ch."\">" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Enseignant&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Action&nbsp;</font></td>" ;
   $l .= "</tr>" ;
   $compteur = 0 ;
   // Est-ce que tous les eleves appartiennent a la bonne classe ?
   $services_classe = SQL_commande ("SELECT s.*,c.nom FROM services_classe s,classes c WHERE s.optionnelle='1' AND s.groupe='1' AND s.classe=c.id_classe AND s.millesime='".$millesime."' ORDER BY c.nom,s.code_classe", $id_sql) ;
   $nsc = SQL_nbr_lignes ($services_classe) ;
   For ($i = 0 ; $i < $nsc ; $i++)
    {
     $sc = SQL_tableau_associatif ($services_classe, "") ;
     // Recherche service prof
     $service_prof = SQL_commande ("SELECT s.*,d.nom_court,p.nom AS nom_prof,p.prenom AS prenom_prof FROM services_prof s,disciplines d,utilisateurs p
                                     WHERE s.service_classe='".$sc ["id_service_classe"]."' AND s.discipline=d.id_discipline AND s.professeur=p.id_utilisateur
                                       AND s.millesime='".$millesime."' LIMIT 1", $id_sql) ;
     $sp = SQL_tableau_associatif ($service_prof, "") ;
     // Recherche le groupe de classe correspondant
     $groupe_classe = SQL_commande ("SELECT * FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1", $id_sql) ;
     $nbr_gc = SQL_nbr_lignes ($groupe_classe) ;
     If ($nbr_gc > 0)
      {
       $tous_eleves = SQL_commande ("SELECT COUNT(id_groupe_eleve) FROM groupes_eleve WHERE groupe='".$sp ["groupe_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
       $te = SQL_ligne_suivante ($tous_eleves) ;
       $eleves = SQL_commande ("SELECT COUNT(g.id_groupe_eleve) FROM groupes_eleve g,eleves e WHERE g.groupe='".$sp ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.classe='".$sp ["classe"]."' AND e.exterieur>='0'", $id_sql) ;
       $nbr = SQL_ligne_suivante ($eleves) ;
       If ($nbr [0] < $te [0])
        {
         $compteur++ ;
	 $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
         $l .= "\">" ;
	 $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
	 $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
	 $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
	 $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;Il y a des &eacute;l&egrave;ves qui font parti du groupe sans faire parti de la m&egrave;me classe.<br>" ;
	 $eleves = SQL_commande ("SELECT e.nom,e.prenoms,c.nom,c.nom_bref FROM groupes_eleve g,eleves e,classes c
	                           WHERE g.groupe='".$sp ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.classe!='".$sp ["classe"]."' AND c.id_classe=e.classe AND e.exterieur>='0'", $id_sql) ;
	 $nbre = SQL_nbr_lignes ($eleves) ;
	 For ($i = 0 ; $i < $nbre ; $i++)
	  {
	   If ($i > 0) { $l .= "<br>" ; }
	   $ele = SQL_ligne_suivante ($eleves) ;
	   $l .= $ele [0]."&nbsp;".$ele [1]."&nbsp;(".$ele [2]."&nbsp;[".$ele [3]."])&nbsp;" ;
          }
	 $l .= "</font></td>" ;
	 $l .= "</tr>" ;
        }
      }
    }

   $services_classe = SQL_commande ("SELECT s.*,c.nom FROM services_classe s,classes c WHERE s.optionnelle='1' AND s.groupe='1' AND s.classe=c.id_classe AND s.millesime='".$millesime."' ORDER BY c.nom,s.code_classe", $id_sql) ;
   $nsc = SQL_nbr_lignes ($services_classe) ;
   For ($i = 0 ; $i < $nsc ; $i++)
    {
     $sc = SQL_tableau_associatif ($services_classe, "") ;
     // Recherche service prof
     $service_prof = SQL_commande ("SELECT s.*,d.nom_court,p.nom AS nom_prof,p.prenom AS prenom_prof FROM services_prof s,disciplines d,utilisateurs p 
                                     WHERE s.service_classe='".$sc ["id_service_classe"]."' AND s.discipline=d.id_discipline AND s.professeur=p.id_utilisateur
				       AND s.millesime='".$millesime."' LIMIT 1", $id_sql) ;
     $sp = SQL_tableau_associatif ($service_prof, "") ;
     // Recherche le groupe de classe correspondant
     $groupe_classe = SQL_commande ("SELECT * FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1", $id_sql) ;
     $nbr_gc = SQL_nbr_lignes ($groupe_classe) ;
     If ($nbr_gc > 0)
      {
       // On a un groupe classe
       // Recherche des eleves et du nombre d'eleve pour l'option
       $eleves_opt = SQL_commande ("SELECT o.*,e.nom,e.prenoms FROM options_eleve o,eleves e WHERE o.service_classe='".$sc ["id_service_classe"]."' AND o.eleve=e.id_eleve AND e.exterieur>='0' AND e.millesime='".$millesime."' ORDER BY o.eleve", $id_sql) ;
       $nbr_eleves_opt = SQL_nbr_lignes ($eleves_opt) ;
       $lgc = SQL_tableau_associatif ($groupe_classe, "") ;
       // Recherche des eleves et du nombre d'eleve pour le groupe
       $eleves_gc = SQL_commande ("SELECT g.*,e.nom,e.prenoms FROM groupes_eleve g,eleves e WHERE g.groupe='".$lgc ["id_groupe_classe"]."' AND g.eleve=e.id_eleve AND e.exterieur>='0' AND e.millesime='".$millesime."' ORDER BY g.eleve", $id_sql) ;
       $nbr_eleves_gc = SQL_nbr_lignes ($eleves_gc) ;
       If ($nbr_eleves_gc > $nbr_eleves_opt)
	{
	 // Pas assez d'option declare donc il faut en ajouter
	 $compteur++ ;
	 $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
         $l .= "\">" ;
	 $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
	 $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
	 $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
	 $l .= "<td align=\"left\"><font size=\"".$tf."\">" ;
	 If ($nbr_eleves_opt > 0)
	  {
	   // Quelques options donc on tri
           $compteur++ ;
	   $el_opt = SQL_tableau_associatif ($eleves_opt, "") ;
	   For ($k = 0 ; $k < $nbr_eleves_gc ; $k++)
	    {
	     $el_gc = SQL_tableau_associatif ($eleves_gc, "") ;
	     If ((integer)$el_gc ["eleve"] != (integer)$el_opt ["eleve"])
	      {
	       $ok = SQL_commande ("INSERT INTO options_eleve (eleve,repere1,repere2,discipline,code_disc,service_classe,millesime) VALUES ('".$el_gc ["eleve"]."','".$el_gc ["repere1"]."','".$el_gc ["repere2"]."','".$sc ["discipline"]."','".$sc ["code_disc"]."','".$sc ["id_service_classe"]."','".$millesime."')", $id_sql) ;
	       $l .= "&nbsp;L'option&nbsp;de&nbsp;l'&eacute;l&egrave;ve&nbsp;".$el_gc ["nom"]."&nbsp;<i>".$el_gc ["prenoms"]."</i>&nbsp;a&nbsp;&eacute;t&eacute;&nbsp;ajout&eacute;e&nbsp;(".$el_gc ["eleve"].").&nbsp;<br>" ;
	      }
             Else
	      {
	       $el_opt = SQL_tableau_associatif ($eleves_opt, "") ;
	      }
	    }
          }
         Else
	  {
	   // Aucun eleve en option declare -> On prend tous les eleves en groupe
           $compteur++ ;
	   For ($k = 0 ; $k < $nbr_eleves_gc ; $k++)
	    {
	     $el_gc = SQL_tableau_associatif ($eleves_gc, "") ;
	     $ok = SQL_commande ("INSERT INTO options_eleve (eleve,repere1,repere2,discipline,code_disc,service_classe,millesime) VALUES ('".$el_gc ["eleve"]."','".$el_gc ["repere1"]."','".$el_gc ["repere2"]."','".$sc ["discipline"]."','".$sc ["code_disc"]."','".$sc ["id_service_classe"]."','".$millesime."')", $id_sql) ;
	     $l .= "&nbsp;L'option&nbsp;de&nbsp;l'&eacute;l&egrave;ve&nbsp;".$el_gc ["nom"]."&nbsp;<i>".$el_gc ["prenoms"]."</i>&nbsp;a&nbsp;&eacute;t&eacute;&nbsp;ajout&eacute;e&nbsp;(".$el_gc ["eleve"].").&nbsp;<br>" ;
	    }
	  }
         $l .= "</font></td></tr>" ;
        }
       ElseIf ($nbr_eleves_gc < $nbr_eleves_opt)
	{
	 // Trop d'option declares par rapport au groupe -> Donc on enleve
	 If ($nbr_eleves_gc > 0)
	  {
	   // Quelques groupes declares -> On tri
	   $el_gc = SQL_tableau_associatif ($eleves_gc, "") ;
	   $notes_el [0][0] = 0 ;
	   $controles_el [0][0] = 0 ;
	   $enleve_el [0][0] = 0 ;
	   // Parcours des eleves et verification
	   For ($j = 0 ; $j < $nbr_eleves_opt ; $j++)
	    {
	     $el_opt = SQL_tableau_associatif ($eleves_opt, "") ;
	     If ((integer)$el_opt ["eleve"] != (integer)$el_gc ["eleve"])
	      {
	       // Y a t-il des notes ?
	       $controles = SQL_commande ("SELECT * FROM controles WHERE service_prof='".$sp ["id_service_prof"]."' AND millesime='".$millesime."'", $id_sql) ;
	       $nbrc = SQL_nbr_lignes ($controles) ;
	       For ($k = 0 ; $k < $nbrc ; $k++)
	        {
		 $ctrls = SQL_tableau_associatif ($controles, "") ;
		 $notes = SQL_commande ("SELECT * FROM notes WHERE controle='".$ctrls ["id_controle"]."' AND eleve='".$el_opt ["eleve"]."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
		 If (SQL_nbr_lignes ($notes) > 0)
		  {
		   // Il y a une note donc il faut donc creer un nouveau devoir et re-atribuer les notes si possible !
		   $nts = SQL_tableau_associatif ($notes, "") ;
		   $notes_el [0][0]++ ;
		   $notes_el [$notes_el [0][0]][0] = $el_opt ["eleve"] ;
		   $notes_el [$notes_el [0][0]][1] = $nts ["id_note"] ;
		   $notes_el [$notes_el [0][0]][2] = $ctrls ["id_controle"] ;
		   
		   // Verifie si le controle est enregistre
		   $ok_controle = 0 ;
		   For ($ll = 1 ; $ll <= $controles_el [0][0] ; $ll++)
		    {
		     If ($controles_el [$ll][0] == $ctrls ["id_controle"]) { $ok_controle = $ll ; }
		    }
		   
		   // Non ! On enregistre.
		   If ($ok_controle == 0)
		    {
		     $controles_el [0][0]++ ;
		     $controles_el [$controles_el [0][0]][0] = $ctrls ["id_controle"] ;
		     $controles_el [$controles_el [0][0]][1] = $ctrls ["date"] ;
		     $controles_el [$controles_el [0][0]][2] = $ctrls ["classe"] ;
		     $controles_el [$controles_el [0][0]][3] = $ctrls ["code_classe"] ;
		     $controles_el [$controles_el [0][0]][4] = $ctrls ["professeur"] ;
		     $controles_el [$controles_el [0][0]][5] = $ctrls ["numen"] ;
		     $controles_el [$controles_el [0][0]][6] = $ctrls ["discipline"] ;
		     $controles_el [$controles_el [0][0]][7] = $ctrls ["code_disc"] ;
		     $controles_el [$controles_el [0][0]][8] = $ctrls ["description"] ;
		     $controles_el [$controles_el [0][0]][9] = $ctrls ["coefficient"] ;
		     $controles_el [$controles_el [0][0]][10] = $ctrls ["periode"] ;
		     $controles_el [$controles_el [0][0]][11] = $ctrls ["enregistrement"] ;
		     $controles_el [$controles_el [0][0]][12] = $ctrls ["date_maj"] ;
		     $controles_el [$controles_el [0][0]][13] = $ctrls ["examen"] ;
		     $controles_el [$controles_el [0][0]][14] = $ctrls ["max"] ;
		     $controles_el [$controles_el [0][0]][15] = $ctrls ["id"] ;
		     $notes_el [$notes_el [0][0]][5] = $controles_el [0][0] ;
                    }
                   Else
		    {
		     $notes_el [$notes_el [0][0]][5] = $ok_controle ;
		    }
		  }
		}
               // On enregistre l'option eleve a enlever
	       $enleve_el [0][0]++ ;
	       $enleve_el [$enleve_el [0][0]][0] = $el_opt ["id_option_eleve"] ;
	       $enleve_el [$enleve_el [0][0]][1] = $el_opt ["eleve"] ;
	       $enleve_el [$enleve_el [0][0]][2] = $el_opt ["nom"] ;
	       $enleve_el [$enleve_el [0][0]][3] = $el_opt ["prenoms"] ;
	      }
             Else
	      {
	       $el_gc = SQL_tableau_associatif ($eleves_gc, "") ;
	      }
	    }
           // S'il y a des notes alors recherche de la discipline enseignant correspondante
	   If ($notes_el [0][0] > 0)
	    {
	     $disc = SQL_commande ("SELECT * FROM services_prof
	                             WHERE professeur='".$sp ["professeur"]."' AND discipline='".$sp ["discipline"]."'
	  			       AND sous_discipline='".$sp ["sous_discipline"]."' AND classe='".$sp ["classe"]."'
				       AND service_classe!='".$sp ["service_classe"]."' AND groupe_classe!='".$sp ["groupe_classe"]."'
				       AND id_service_prof!='".$sp ["id_service_prof"]."' AND millesime='".$millesime."'", $id_sql) ;
	     $nbrd = SQL_nbr_lignes ($disc) ;
             If ($nbrd > 0)
	      {
	       If ($nbrd > 1)
	        {
		 $l .= "Services possibles : " ;
		 For ($k = 0 ; $k < $nbrd ; $k++)
		  {
		   $dsc = SQL_tableau_associatif ($disc, "") ;
	           $l .= $dsc ["id_service_prof"]."-" ;
                  }
		}
               Else
	        {
	         $dsc = SQL_tableau_associatif ($disc, "") ;
	         //$l .= "Service possible : ".$dsc ["id_service_prof"] ;
		 // On cree les controles
		 For ($k = 1 ; $k <= $controles_el [0][0] ; $k++)
		  {
		   $ok = SQL_commande ("INSERT INTO controles (date,classe,code_classe,professeur,numen,discipline,code_disc,service_prof,description,coefficient,periode,enregistrement,date_maj,examen,max,id,millesime)
		                        VALUES ('".$controles_el [$k][1]."','".$controles_el [$k][2]."','".$controles_el [$k][3]."','".$controles_el [$k][4]."','".$controles_el [$k][5]."',
					        '".$controles_el [$k][6]."','".$controles_el [$k][7]."','".$dsc ["id_service_prof"]."','".$controles_el [$k][8]."','".$controles_el [$k][9]."',
						'".$controles_el [$k][10]."','".$controles_el [$k][11]."','".$controles_el [$k][12]."','".$controles_el [$k][13]."','".$controles_el [$k][14]."',
						'".$controles_el [$k][15]."','".$millesime."')", $id_sql) ;
		   $ct = SQL_commande ("SELECT id_controle FROM controles
		                         WHERE date='".$controles_el [$k][1]."' AND classe='".$controles_el [$k][2]."' AND code_classe='".$controles_el [$k][3]."'
		                           AND professeur='".$controles_el [$k][4]."' AND numen='".$controles_el [$k][5]."' AND discipline='".$controles_el [$k][6]."'
					   AND code_disc='".$controles_el [$k][7]."' AND service_prof='".$dsc ["id_service_prof"]."' AND description='".$controles_el [$k][8]."'
 					   AND coefficient='".$controles_el [$k][9]."' AND periode='".$controles_el [$k][10]."' AND enregistrement='".$controles_el [$k][11]."'
					   AND date_maj='".$controles_el [$k][12]."' AND examen='".$controles_el [$k][13]."' AND max='".$controles_el [$k][14]."'
					   AND id='".$controles_el [$k][15]."' AND millesime='".$millesime."' LIMIT 1", $id_sql) ;
                   $c = SQL_ligne_suivante ($ct) ;
		   $controles_el [$k][16] = $c [0] ;
                  }
		 For ($k = 1 ; $k <= $notes_el [0][0] ; $k++)
		  {
                   $ok = SQL_commande ("UPDATE notes SET controle='".$controles_el [$notes_el [$k][5]][15]."' WHERE id_note='".$notes_el [$k][1]."' AND millesime='".$millesime."' LIMIT 1", id_sql) ;
		   //$l .= "<br>UPDATE notes SET controle='".$controles_el [$notes_el [$k][5]][16]."' WHERE id_note='".$notes_el [$k][1]."' LIMIT 1<br>" ;
                  }
                 // On peut enlever l'option
		 $compteur++ ;
		 $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
                 $l .= "\">" ;
	         $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
	         $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
	         $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
	         $l .= "<td align=\"left\"><font size=\"".$tf."\">" ;
                 For ($k = 1 ; $k <= $enleve_el [0][0] ; $k++)
	          {
	           $ok = SQL_commande ("DELETE FROM options_eleve WHERE id_option_eleve='".$enleve_el [$k][0]."' LIMIT 1", $id_sql) ;
	           //$l .= "DELETE FROM options_eleve WHERE id_option_eleve='".$enleve_el [$k][0]."' LIMIT 1<br>" ;
		   $l .= "&nbsp;L'option&nbsp;de&nbsp;l'&eacute;l&egrave;ve&nbsp;".$enleve_el [$k][2]."&nbsp;<i>".$enleve_el [$k][3]."</i>&nbsp;a&nbsp;&eacute;t&eacute;&nbsp;effac&eacute;e&nbsp;(".$enleve_el [$k][1].").&nbsp;<br>" ;
                  }
                }
	      }
             Else
	      {
	       // Aucune discipline de remplacement -> On ne peut pas effacer donc il faut attribuer des groupes
	       //$l .= "Attribution de groupes.".$enleve_el [0][0] ;
	      }
            }
           Else
	    {
             // Pas de notes donc on enleve !
	     $compteur++ ;
	     $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
             $l .= "\">" ;
	     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
	     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
	     $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
	     $l .= "<td align=\"left\"><font size=\"".$tf."\">" ;
	     For ($k = 1 ; $k <= $enleve_el [0][0] ; $k++)
	      {
	       $ok = SQL_commande ("DELETE FROM options_eleve WHERE id_option_eleve='".$enleve_el [$k][0]."' LIMIT 1", $id_sql) ;
	       //$l .= "DELETE FROM options_eleve WHERE id_option_eleve='".$enleve_el [$k][0]."' LIMIT 1<br>" ;
	       $l .= "&nbsp;L'option&nbsp;de&nbsp;l'&eacute;l&egrave;ve&nbsp;".$enleve_el [$k][2]."&nbsp;<i>".$enleve_el [$k][3]."</i>&nbsp;a&nbsp;&eacute;t&eacute;&nbsp;effac&eacute;e&nbsp;(".$enleve_el [$k][1].").&nbsp;<br>" ;
              }
	    }
          }
         Else
	  {
	   // Aucun eleve en groupe declare -> Juste optionnel -> OK
	   $ok = SQL_commande ("UPDATE services_classe SET groupe='0' WHERE id_service_classe='".$sc ["id_service_classe"]."' LIMIT 1", $id_sql) ;
	   $ok = SQL_commande ("UPDATE services_prof SET groupe_classe='0' WHERE id_service_prof='".$sp ["id_service_prof"]."' LIMIT 1", $id_sql) ;
	   $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
           $l .= "\">" ;
	   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
	   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
	   $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
	   $l .= "<td align=\"left\"><font size=\"".$tf."\">" ;
	   $l .= "&nbsp;L'option&nbsp;du&nbsp;service&nbsp;classe&nbsp;et&nbsp;enseignant&nbsp;a&nbsp;&eacute;t&eacute;&nbsp;enlev&eacute;&nbsp;(".$sc ["id_service_classe"].")/(".$sp ["id_service_prof"].").&nbsp;<br>" ;
           $compteur++ ;
	  }
         $l .= "</font></td></tr>" ;
	}
       ElseIf ($nbr_eleves_gc == $nbr_eleves_opt)
	{
	 // Ok tout va bien !
	 //$l .= " <tr bgcolor=\"".$ch."\"><td colspan=\"4\">Service classe ".$sc ["id_service_classe"]." -> Autant d'eleve que de groupes et d'options</td></tr>\n" ;
         //$compteur++ ;
	}
      }
     Else
      {
       // Pas de groupe declare pour le service classe en groupe : Probleme sur la base !
       // On peut directement enlever la declaration du groupe dans services_classe
       //$ok = SQL_commande ("UPDATE services_classe SET groupe='0' WHERE id_service_classe='".$sc ["id_service_classe"]."' LIMIT 1", $id_sql)
       $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
       $l .= "\">" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sc ["nom"])."&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_court"])."&nbsp;<br>&nbsp;Service&nbsp;".$sp ["id_service_prof"]."&nbsp;</font></td>" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp ["nom_prof"])."&nbsp;<i>".Str_Replace (" ", "&nbsp;", $sp ["prenom_prof"])."</i>&nbsp;</font></td>" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;Le&nbsp;groupe&nbsp;de&nbsp;classe&nbsp;est&nbsp;enlev&eacute;&nbsp;(".$sc ["id_service_classe"].")</font></td>" ;
       $l .= "</tr>" ;
       $ok = SQL_commande ("UPDATE services_classe SET groupe='0' WHERE id_service_classe='".$sc ["id_service_classe"]."' LIMIT 1", $id_sql) ;
       $compteur++ ;
      }
    }
   
   // Verification de l'attribution service classe -> groupe classe
   $services_prof = SQL_commande ("SELECT s.id_service_prof,s.service_classe,s.groupe_classe,c.id_classe,c.nom,c.nom_bref,d.nom_court,s.professeur
                                     FROM services_prof s,classes c,disciplines d
				    WHERE s.groupe_classe!='0' AND s.millesime='".$millesime."'
				      AND s.classe=c.id_classe
				      AND s.discipline=d.id_discipline ORDER BY s.code_classe", $id_sql) ;
   $nsp = SQL_nbr_lignes ($services_prof) ;
   For ($i = 0 ; $i < $nsp ; $i++)
    {
     $texte = "" ;
     $sp = SQL_ligne_suivante ($services_prof) ;
     $services_classe = SQL_commande ("SELECT optionnelle,groupe,classe,code_classe FROM services_classe WHERE id_service_classe='".$sp [1]."'", $id_sql) ;
     $nsc = SQL_nbr_lignes ($services_classe) ;
     If ($nsc > 0)
      {
       If ($nsc == 1)
        {
	 $sc = SQL_ligne_suivante ($services_classe) ;
	 If ($sc [1] == 1)
	  {
           $groupes = SQL_commande ("SELECT service_classe FROM groupes_classe WHERE id_groupe_classe='".$sp [2]."'", $id_sql) ;
           $ngp = SQL_nbr_lignes ($groupes) ;
           If ($ngp > 0)
            {
             If ($ngp == 1)
              {
	       $gp = SQL_ligne_suivante ($groupes) ;
	       If ($gp [0] != $sp [1])
	        {
		 $ok = SQL_commande ("UPDATE groupes_classe SET service_classe='".$sp [1]."' WHERE id_groupe_classe='".$sp [2]."' LIMIT 1", $id_sql) ;
		 $ok = SQL_commande ("INSERT INTO journal (texte,script,date,adresse) VALUES
		                      ('".Session_Id()."-".$_SERVER ["PHP_SELF"]."-REPARATION-',
				       'groupes_classe CHANGE service_classe=\\'".$gp [0]."\\' PAR \\'".$sp [1]."\\' SUR id_groupe_classe=\\'".$sp [2]."\\'',
				       '".Date ("Y-m-d H:i:s")."','".adresse_ip ()."')", $id_sql) ;
		 $texte = "R&eacute;paration du groupe ".$sp [2] ;
		}
	      }
             Else
              {
	       $texte = "Plusieurs groupes pour un m&ecirc;me service classe : " ;
	       For ($j = 0 ; $j < $ngp ; $j++)
                {
	         $gp = SQL_ligne_suivante ($groupes) ;
	         $texte .= $gp [0]."-" ;
	        }
	      }
	    }
	  }
	 Else { $texte = "Service classe inexistant pour le service prof ".$sp [0] ; }
	}
       Else
        {
	 $texte = "Plusieurs services classe pour un m&ecirc;me servcie prof : " ;
	 For ($j = 0 ; $j < $nsc ; $j++)
          {
	   $sc = SQL_ligne_suivante ($services_classe) ;
	   $texte .= $sc [0]."-" ;
	  }
	}
      }
     Else
      {
       $texte = "Le groupe ".$sp [2]." n'existe pas." ;
      }
     If ($texte != "")
      {
       $l .= "<tr" ; If ($compteur%2 == 1) { $l.= " bgcolor=\"".$ch ; }
       $l .= "\">" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp [4])."&nbsp;(".Str_Replace (" ", "&nbsp;", $sp [5]).")&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $sp [6])."&nbsp;<br>&nbsp;Service&nbsp;".$sp [0]."&nbsp;</font></td>" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", nom_utilparid ($sp [7]))."&nbsp;</font></td>" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".Str_Replace (" ", "&nbsp;", $texte)."&nbsp;</font></td>" ;
       $l .= "</tr>" ;
       $compteur++ ;
      }
    }
   
   If ($compteur == 0)
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;options&nbsp;et&nbsp;des&nbsp;groupes&nbsp;de&nbsp;classe.&nbsp;</td></tr>" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;coh&eacute;rente&nbsp;au&nbsp;niveau&nbsp;des&nbsp;options/groupes&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   $l .= $d."</table>" ;
   Return $l ;
  }
 
 /**
 * Teste de coherence de la base des controles
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function coherence_controles ($ch, $cf, $tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   // Re-attribution des numens pour prof non a 0
   $controles = SQL_commande ("SELECT id_controle,professeur FROM controles WHERE professeur!='0' AND numen=''", $id_sql) ;
   $nbr_controles = SQL_nbr_lignes ($controles) ;
   For ($i = 0 ; $i < $nbr_controles ; $i++)
    {
     $controle = SQL_ligne_suivante ($controles) ;
     $ut = SQL_commande ("SELECT numen FROM utilisateurs WHERE id_utilisateur='".$controle [1]."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($ut) == 1)
      {
       $util = SQL_ligne_suivante ($ut) ;
       $ok = SQL_commande ("UPDATE controles SET numen='".$util [0]."' WHERE id_controle='".$controle [0]."' LIMIT 1", $id_sql) ;
      }
    }
   $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
   $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"8\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;contr&ocirc;les.&nbsp;</td></tr>" ;
   $l .= "<tr bgcolor=\"".$ch."\">" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Contr&ocirc;le&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Description&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Date&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;C&oelig;fficient&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Enseignant&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Action&nbsp;</font></td>" ;
   $l .= "</tr>" ;
   $negatif = 0 ;
   $controles = SQL_commande ("SELECT c.*,s.nom,s.nom_bref,d.nom_long FROM controles c,classes s,disciplines d WHERE c.professeur='0' AND c.classe=s.id_classe AND c.discipline=d.id_discipline ORDER BY s.nom_bref,s.nom", $id_sql) ;
   $nbr_controles = SQL_nbr_lignes ($controles) ;
   For ($i = 0 ; $i < $nbr_controles ; $i++)
    {
     $controle = SQL_tableau_associatif ($controles, "") ;
     $l .= "<tr" ; If ($i%2 == 1) { $l.= " bgcolor=\"".$ch ; }
     $l .= "\">" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$controle ["nom"]."&nbsp;(".$controle ["nom_bref"].")&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$controle ["nom_long"]."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$controle ["id_controle"]."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$controle ["description"]."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".decode_date_4 ($controle ["date"])."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".Str_Replace ('.',',',$controle ["coefficient"])."&nbsp;</font></td>" ;
     $sp = SQL_commande ("SELECT id_service_prof,professeur,numen_prof FROM services_prof WHERE id_service_prof='".$controle ["service_prof"]."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($sp) == 1)
      {
       // Reaffectation du controle
       $s = SQL_ligne_suivante ($sp) ;
       // Test alias
       If ($s [1] < 0)
        {
	 $al = SQL_commande ("SELECT g.id_utilisateur,u.numen FROM groupes_alias g,utilisateurs u WHERE g.id_alias='".(-$s [1])."' AND g.id_service_prof='".$s [0]."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
	 If (SQL_nbr_lignes ($al) == 1)
	  {
	   $alias = SQL_ligne_suivante ($al) ;
	   $ok = SQL_commande ("UPDATE controles SET professeur='".$alias [0]."',numen='".$alias [1]."' WHERE id_controle='".$controle ["id_controle"]."' LIMIT 1", $id_sql) ;
	   $enseignant = nom_utilparid ($alias [0], 1) ;
	   $action = "R&eacute;-attribution&nbsp;du&nbsp;contr&ocirc;le." ;
	  }
	 Else
	  {
	   // C'est un alias sans definition ???
	   $ensseignant = "?" ;
	   $action = "Aucune" ;
	   $negatif++ ;
	  }
	}
       Else
        {
         // Action
	 If ($s [1] > 0)
	  {
           $ok = SQL_commande ("UPDATE controles SET professeur='".$s [1]."',numen='".$s [2]."' WHERE id_controle='".$controle ["id_controle"]."' LIMIT 1", $id_sql) ;
	   $enseignant = nom_utilparid ($s [1], 1) ;
	   $action = "R&eacute;-attribution&nbsp;du&nbsp;contr&ocirc;le." ;
	  }
	 Else
	  {
	   $enseignant = "?" ;
	   $action = "Pas&nbsp;d'enseignant&nbsp;trouv&eacute;&nbsp;:&nbsp;Aucune&nbsp;action." ;
	   $negatif++ ;
	  }
	}
      }
     Else
      {
       // Service inexistant donc controle a detruire...
       $enseignant = "?" ;
       $action = "Destruction&nbsp;du&nbsp;contr&ocirc;le&nbsp;&agrave;&nbsp;faire." ;
      }
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$enseignant."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$action."&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   If ($nbr_controles == 0)
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;contr&ocirc;les.&nbsp;</td></tr>" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;coh&eacute;rente&nbsp;au&nbsp;niveau&nbsp;des&nbsp;attributions&nbsp;des&nbsp;contr&ocirc;les&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   ElseIf ($negatif > 0)
    {
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"8\">&nbsp;Attribuer&nbsp;manuellement&nbsp;les&nbsp;services&nbsp;concern&eacute;s&nbsp;avant&nbsp;de&nbsp;refaire&nbsp;un&nbsp;test&nbsp;de&nbsp;coh&eacute;rence.&nbsp;</td></tr>" ;
    }
   $l .= "</table>" ;
   
   Return $l ;
  }
 
 /**
 * Teste de coherence de la base des appreciations
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function coherence_appreciations ($ch, $cf, $tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
   $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"4\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;appr&eacute;ciations.&nbsp;</td></tr>" ;
   $l .= "<tr bgcolor=\"".$ch."\">" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Service&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Action&nbsp;</font></td>" ;
   $l .= "</tr>" ;
   $nbr_textes_vides = 0 ;
   $nbr_appreciations_trop = 0 ;
   $negatif = 0 ;
   $appreciations = SQL_commande ("SELECT a.*,s.nom,s.nom_bref,d.nom_long FROM appreciations a,classes s,disciplines d WHERE a.professeur='0' AND a.classe=s.id_classe AND a.discipline=d.id_discipline ORDER BY s.nom_bref,s.nom", $id_sql) ;
   $nbr_appreciations = SQL_nbr_lignes ($appreciations) ;
   For ($i = 0 ; $i < $nbr_appreciations ; $i++)
    {
     $appreciation = SQL_tableau_associatif ($appreciations, "") ;
     $l .= "<tr" ; If ($i%2 == 1) { $l.= " bgcolor=\"".$ch ; }
     $l .= "\">" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$appreciation ["nom"]."&nbsp;(".$appreciation ["nom_bref"].")&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$appreciation ["id_appreciation"]."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$appreciation ["nom_long"]."&nbsp;</font></td>" ;
     // Test alias
     $al = SQL_commande ("SELECT g.id_alias,u.numen,g.id_utilisateur FROM groupes_alias g,utilisateurs u WHERE g.id_service_prof='".$appreciation ["service_prof"]."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($al) == 1)
      {
       $alias = SQL_ligne_suivante ($al) ;
       $ok = SQL_commande ("UPDATE appreciations SET professeur='".$alias [2]."',numen='".$alias [1]."' WHERE id_appreciation='".$appreciation ["id_appreciation"]."' LIMIT 1", $id_sql) ;
       $action = "R&eacute;-attribution&nbsp;du&nbsp;contr&ocirc;le&nbsp;&agrave;&nbsp;l'&eacute;quipe&nbsp;de&nbsp;".nom_utilparid ($alias [2], 1)."." ;
      }
     Else
      {
       // Non retrouve
       $sp = SQL_commande ("SELECT professeur,numen_prof FROM services_prof WHERE id_service_prof='".$appreciation ["service_prof"]."' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($sp) == 1)
        {
         $serv_p = SQL_ligne_suivante ($sp) ;
	 $ok = SQL_commande ("UPDATE appreciations SET professeur='".$serv_p [0]."',numen='".$serv_p [1]."' WHERE id_appreciation='".$appreciation ["id_appreciation"]."' LIMIT 1", $id_sql) ;
         $action = "R&eacute;-attribution&nbsp;du&nbsp;contr&ocirc;le&nbsp;&agrave;&nbsp;".nom_utilparid ($serv_p [0], 1)."." ;
	}
       Else
        {
	 $action = "Pas&nbsp;d'enseignant&nbsp;trouv&eacute;&nbsp;:Aucune&nbsp;action." ;
         $negatif++ ;
	}
      }
     $l .= "<td><font size=\"".$tf."\">&nbsp;".$action."&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   /*
   echo "SELECT DISTINCT a.id_appreciation,a.eleve,a.professeur,a.discipline,a.service_prof,a.periode,a.colonne,a.texte,a.enregistrement
                                  FROM appreciations a,appreciations b WHERE a.id_appreciation!=b.id_appreciation
                                   AND a.eleve=b.eleve AND a.professeur=b.professeur AND a.discipline=b.discipline
				   AND a.service_prof=b.service_prof AND a.periode=b.periode AND a.colonne=b.colonne
			      ORDER BY a.professeur,a.classe,a.eleve,a.enregistrement,a.date_maj<br>" ;
   */
   $app_double = SQL_commande ("SELECT DISTINCT a.id_appreciation,a.eleve,a.professeur,a.discipline,a.service_prof,a.periode,a.colonne,a.texte,a.enregistrement
                                  FROM appreciations a,appreciations b WHERE a.id_appreciation!=b.id_appreciation
                                   AND a.eleve=b.eleve AND a.professeur=b.professeur AND a.discipline=b.discipline
				   AND a.service_prof=b.service_prof AND a.periode=b.periode AND a.colonne=b.colonne
			      ORDER BY a.professeur,a.classe,a.eleve,a.enregistrement,a.date_maj", $id_sql) ;
   $nbr_app_double = SQL_nbr_lignes ($app_double) ;
   If ($nbr_app_double > 1)
    {
     $l1 = SQL_ligne_suivante ($app_double) ;
     $table [0][0] = 1 ;
     $table [1][0] = $l1 [0] ;
     $table [1][1] = $l1 [7] ;
     $table [1][2] = $l1 [8] ;
     $table [1][3] = 0 ;
     For ($i = 1 ; $i < $nbr_app_double ; $i++)
      {
       $l2 = SQL_ligne_suivante ($app_double) ;
       $oki = 0 ;
       If (($l1 [1] == $l2 [1]) And ($l1 [2] == $l2 [2]) And ($l1 [3] == $l2 [3]) And ($l1 [4] == $l2 [4]) And ($l1 [5] == $l2 [5]) And ($l1 [6] == $l2 [6]))
        {
	 $table [0][0]++ ;
	 $table [$table [0][0]][0] = $l2 [0] ;
	 $table [$table [0][0]][1] = $l2 [7] ;
	 $table [$table [0][0]][2] = $l2 [8] ;
	 $table [$table [0][0]][3] = 0 ;
	 $oki = 1 ;
	}
       If (($oki == 0) Or ($i == $nbr_app_double-1))
        {
	 // Traitement
	 // On efface les texte vides
	 For ($j = 1 ; $j <= $table [0][0] ; $j++)
	  {
	   If ($table [$j][3] == 0)
	    {
	     If ($table [$j][1] == "")
	      {
	       $okk = SQL_commande ("DELETE FROM appreciations WHERE id_appreciation='".$table [$j][0]."' LIMIT 1", $id_sql) ;
	       $table [$j][3] = 1 ;
	       $nbr_textes_vides++ ;
	      }
	    }
	  }
	 // On prend la derniere rencontree
	 $ok = 0 ;
	 For ($j = $table [0][0] ; $j > 0 ; $j--)
	  {
	   If ($table [$j][3] == 0)
	    {
	     If ($table [$j][1] != "")
	      {
	       If ($ok == 0) { $ok = 1 ; }
	       Else
	        {
		 $okk = SQL_commande ("DELETE FROM appreciations WHERE id_appreciation='".$table [$j][0]."' LIMIT 1", $id_sql) ;
		 $nbr_appreciations_trop++ ;
		}
	       $table [$j][3] = 1 ;
	      }
	    }
	  }
	 // Fin on boucle
	 $l1 = $l2 ;
	 $table [0][0] = 1 ;
         $table [1][0] = $l1 [0] ;
         $table [1][1] = $l1 [7] ;
         $table [1][2] = $l1 [8] ;
	 $table [1][3] = 0 ;
	}
      }
    }
   If ($nbr_appreciations == 0)
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;appr&eacute;ciations.&nbsp;</td></tr>" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;coh&eacute;rente&nbsp;au&nbsp;niveau&nbsp;des&nbsp;attributions&nbsp;des&nbsp;appr&eacute;ciations&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   If ($nbr_textes_vides != 0)
    {
     $l .= "<tr><td align=\"center\"" ; If ($nbr_appreciations != 0) { $l .= " colspan=\"4\"" ; }
     $l .= ">&nbsp;Effacement&nbsp;de&nbsp;".$nbr_textes_vides."&nbsp;appr&eacute;ciation" ;
     If ($nbr_textes_vides > 1) { $l .= "s&nbsp;vides" ; } Else { $l .= "&nbsp;vide" ; }
     $l .= ".&nbsp;</td></tr>" ;
    }
   If ($nbr_appreciations_trop != 0)
    {
     $l .= "<tr><td align=\"center\"" ; If ($nbr_appreciations != 0) { $l .= " colspan=\"4\"" ; }
     $l .= ">&nbsp;Effacement&nbsp;de&nbsp;".$nbr_appreciations_trop."&nbsp;appr&eacute;ciation" ; If ($nbr_appreciations_trop > 1) { $l .= "s" ; }
     $l .= "&nbsp;en&nbsp;trop&nbsp;(doublon).&nbsp;</td></tr>" ;
    }
   $l .= "</table>" ;
   Return $l ;
  }
 
 /**
 * Teste de coherence de la base des services
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function coherence_services ($ch, $cf, $tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
   $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"4\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;services.&nbsp;</td></tr>" ;
   $l .= "<tr bgcolor=\"".$ch."\">" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Service&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Action&nbsp;</font></td>" ;
   $l .= "</tr>" ;
   $negatif = 0 ;
   $services = SQL_commande ("SELECT p.*,s.nom,s.nom_bref,d.nom_long FROM services_prof p,classes s,disciplines d WHERE p.professeur='0' AND p.classe=s.id_classe AND p.discipline=d.id_discipline ORDER BY s.nom_bref,s.nom", $id_sql) ;
   $nbr_services = SQL_nbr_lignes ($services) ;
   For ($i = 0 ; $i < $nbr_services ; $i++)
    {
     $service = SQL_tableau_associatif ($services, "") ;
     $l .= "<tr" ; If ($i%2 == 1) { $l.= " bgcolor=\"".$ch ; }
     $l .= "\">" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$service ["nom"]."&nbsp;(".$service ["nom_bref"].")&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$service ["id_service_prof"]."&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$service ["nom_long"]."&nbsp;</font></td>" ;
     // Test alias
     $al = SQL_commande ("SELECT g.id_alias,u.numen,g.id_utilisateur FROM groupes_alias g,utilisateurs u WHERE g.id_service_prof='".$service ["id_service_prof"]."' AND g.numero='1' AND g.id_utilisateur=u.id_utilisateur LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($al) == 1)
      {
       $alias = SQL_ligne_suivante ($al) ;
       $ok = SQL_commande ("UPDATE services_prof SET professeur='-".$alias [0]."',numen_prof='".$alias [1]."' WHERE id_service_prof='".$service ["id_service_prof"]."' LIMIT 1", $id_sql) ;
       $action = "R&eacute;-attribution&nbsp;du&nbsp;service&nbsp;&agrave;&nbsp;l'&eacute;quipe&nbsp;de&nbsp;".nom_utilparid ($alias [2], 1)."." ;
      }
     Else
      {
       // Non retrouve
       $action = "Pas&nbsp;d'enseignant&nbsp;trouv&eacute;&nbsp;:Aucune&nbsp;action." ;
       $negatif++ ;
      }
     $l .= "<td><font size=\"".$tf."\">&nbsp;".$action."&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   If ($nbr_services == 0)
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\">&nbsp;Test&nbsp;de&nbsp;coh&eacute;rence&nbsp;des&nbsp;services.&nbsp;</td></tr>" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;coh&eacute;rente&nbsp;au&nbsp;niveau&nbsp;des&nbsp;attributions&nbsp;des&nbsp;services&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   ElseIf ($negatif > 0)
    {
     $l .= "<tr bgcolor=\"".$ch."\"><td align=\"center\" colspan=\"4\">&nbsp;Attribuer&nbsp;manuellement&nbsp;les&nbsp;services&nbsp;concern&eacute;s&nbsp;avant&nbsp;de&nbsp;refaire&nbsp;un&nbsp;test&nbsp;de&nbsp;coh&eacute;rence.&nbsp;</td></tr>" ;
    }
   $l .= "</table>" ;
   Return $l ;
  }
 
 /**
 * Optimisation de la base des groupes
 * @param string $d NON UTILISE : A ELIMINER
 * @param string $ch Couleur ligne entete
 * @param string $cf Couleur fond du tableau
 * @param string $tf Taille de la fonte
 * @return string Tableau HTML du resultat
 */
 Function purger_groupes ($d, $ch, $cf, $tf)
  {
   Global $id_sql ;
   $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= "<tr bgcolor=\"".$ch."\">" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Discipline&nbsp;</font></td>" ;
   $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Groupe&nbsp;</font></td>" ;
   $l .= "</tr>" ;
   $compteur = 0 ;
   $groupes = SQL_commande ("SELECT * FROM groupes_classe WHERE millesime='".millesime (0)."' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($groupes) ; $i++)
    {
     $gp = SQL_tableau_associatif ($groupes, "") ;
     $service_prof = SQL_commande ("SELECT * FROM services_prof WHERE groupe_classe='".$gp ["id_groupe_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     If (SQL_nbr_lignes ($service_prof) == 0)
      {
       // Service enseignant n'existe pas
       $compteur++ ;
       //$ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$gp ["id_groupe_classe"]."'", $id_sql) ;
       $classe = SQL_commande ("SELECT nom,nom_bref FROM classes WHERE id_classe='".$gp ["classe"]."' LIMIT 1", $id_sql) ;
       $cl = SQL_ligne_suivante ($classe) ;
       $disc = SQL_commande ("SELECT nom_long FROM disciplines WHERE id_discipline='".$gp ["discipline"]."' LIMIT 1", $id_sql) ;
       $ds = SQL_ligne_suivante ($disc) ;
       $l .= "<tr>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl [0]."&nbsp;(".$cl [1].")&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$ds [0]."&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$gp ["code_groupe"]."(".$gp ["id_groupe_classe"].")&nbsp;</font></td>" ;
       $l .= "</tr>" ;
      }
     Else
      {
       // Existe t-il un autre groupe classe avec le meme service prof ?
       $autre_gp = SQL_commande ("SELECT id_groupe_classe FROM groupes_classe
                                   WHERE id_groupe_classe!='".$gp ["id_groupe_classe"]."' AND classe='".$gp ["classe"]."'
				     AND discipline='".$gp ["discipline"]."' AND service_classe='".$gp ["service_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
       echo "SELECT id_groupe_classe FROM groupes_classe
                                   WHERE id_groupe_classe!='".$gp ["id_groupe_classe"]."' AND classe='".$gp ["classe"]."'
				     AND discipline='".$gp ["discipline"]."' AND service_classe='".$gp ["service_classe"]."' AND millesime='".millesime (0)."'<br>" ;
       If (SQL_nbr_lignes ($autre_gp) > 0)
        {
	 // Ah, AH !
	 For ($j = 0 ; $j < SQL_nbr_lignes ($autre_gp) ; $j++)
	  {
	   $agp = SQL_tableau_associatif ($autre_gp, "") ;
	   $compteur++ ;
	   $l .= "<tr>" ;
           $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$cl [0]."&nbsp;(".$cl [1].")&nbsp;</font></td>" ;
           $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$ds [0]."&nbsp;</font></td>" ;
           $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;".$agp ["code_groupe"]."(".$agp ["id_groupe_classe"].")&nbsp;en&nbsp;double&nbsp;(".$gp ["id_groupe_classe"].")</font></td>" ;
           $l .= "</tr>" ;
	   $requete = "DELETE FROM groupes_classe WHERE id_groupe_classe='" ;
	   If ($gp ["id_groupe_classe"] > $agp ["id_groupe_classe"]) { $requete .= $agp ["id_groupe_classe"] ; }
	   Else { $requete .= $gp ["id_groupe_classe"] ; }
	  }
	}
      }
    }
   If ($compteur == 0)
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\" colspan=\"3\"><font size=\"".$tf."\">&nbsp;&nbsp;La&nbsp;base&nbsp;est&nbsp;d&eacute;j&agrave;&nbsp;purg&eacute;e&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
    }
   $l .= "</table>" ;
   Return $l ;
  }
 
 /**
 * Reparation base des disciplines
 * @param string $d Espace a positionner au debut du tableau (A ELIMINER)
 * @param string $ch Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @param string $action Lien HTML pour le formulaire (adresse de la page de traitement)
 * @param string $img_sup Lien HTML de l'image "SUPPRIMER"
 * @param string $img_val Lien HTML de l'image "VALIDER"
 * @param string $img_ann Lien HTML de l'image "ANNULER"
 * @return string Rapport en HTML
 */
 Function reparation_disciplines ($d, $ch, $cf, $cl, $tf, $action, $img_sup, $img_val, $img_ann)
  {
   Global $id_sql ;
   $compteur = 0 ;
   $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE discipline='0' AND millesime='".millesime (0)."' ORDER BY code_classe", $id_sql) ;
   If (SQL_nbr_lignes ($services_prof) > 0)
    {
     $l  = "<form ACTION=\"".$action."\" name=\"forme\" METHOD=\"POST\">" ;
     $l .= "<input type=\"hidden\" name=\"nombre\" value=\"".SQL_nbr_lignes ($services_prof)."\">" ;
     $l .= "<table align=\"center\" border=\"0\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"1\">" ;
     $l .= "<tr bgcolor=\"".$ch."\">" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Classe&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Professeur&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Opt.&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Grp.&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Code&nbsp;Grp.&nbsp;</font></td>" ;
     $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;Disciplines&nbsp;possibles&nbsp;</font></td>" ;
     $l .= "<td bgcolor=\"".$cf."\"></td>" ;
     $l .= "</tr>" ;

     For ($i = 0 ; $i < SQL_nbr_lignes ($services_prof) ; $i++)
      {
       $sp = SQL_tableau_associatif ($services_prof, "") ;
       
       $disciplines = SQL_commande ("SELECT * FROM disciplines WHERE code='".$sp ["code_disc"]."' AND millesime='".millesime (0)."'", $id_sql) ;
       
       $classes = SQL_commande ("SELECT * FROM classes WHERE nom_bref='".$sp ["code_classe"]."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
       $clss = SQL_tableau_associatif ($classes, "") ;
       
       $utils = SQL_commande ("SELECT * FROM utilisateurs WHERE numen='".$sp ["numen_prof"]."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
       $u = SQL_tableau_associatif ($utils, "") ;
       
       $services_classe = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$sp ["service_classe"]."' LIMIT 1", $id_sql) ;
       $sc = SQL_tableau_associatif ($services_classe, "") ;
       
       If ($sc ["optionnelle"]) { $option = " CHECKED" ; } Else { $option = "" ; }
       If ($sc ["groupe"]) { $groupe = " CHECKED" ; } Else { $groupe = "" ; }
       If ($sp ["groupe_classe"])
        {
	 $groupes_classe = SQL_commande ("SELECT code_groupe,id_groupe_classe FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1", $id_sql) ;
         $gc = SQL_ligne_suivante ($groupes_classe, "") ;
	}
       Else
        {
	 $gc [0] = "" ;
	 $gc [1] = 0 ;
	}
       
       $l .= "<input type=\"hidden\" name=\"id_service_prof_".$i."\" value=\"".$sp ["id_service_prof"]."\">" ;
       $l .= "<input type=\"hidden\" name=\"id_service_classe_".$i."\" value=\"".$sc ["id_service_classe"]."\">" ;
       $l .= "<input type=\"hidden\" name=\"id_groupe_classe_".$i."\" value=\"".$gc [1]."\">" ;
       $l .= "<tr" ;
       If ($i%2) { $l .= " bgcolor=\"".$cl."\"" ; }
       $l .= ">\n" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".$clss ["nom"]."&nbsp;(".$clss ["nom_bref"].")&nbsp;</font></td>" ;
       $l .= "<td align=\"left\"><font size=\"".$tf."\">&nbsp;".$u ["nom"]."&nbsp;<i>".$u ["prenom"]."</i>&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;<input type=\"checkbox\" name=\"option_".$i."\"".$option.">&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;<input type=\"checkbox\" name=\"groupe_".$i."\"".$option.">&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">&nbsp;<input type=\"text\" name=\"code_groupe_".$i."\" value=\"".$gc [0]."\" size=\"9\" maxlength=\"8\">&nbsp;</font></td>" ;
       $l .= "<td align=\"center\"><font size=\"".$tf."\">" ;
       If (SQL_nbr_lignes ($disciplines) > 0)
        {
	 If (SQL_nbr_lignes ($disciplines) == 1)
	  {
	   $disc = SQL_tableau_associatif ($disciplines, "") ;
           $l .= "&nbsp;".$disc ["nom_court"]."&nbsp;" ;
	  }
	 Else
	  {
	   $l .= "&nbsp;<select name=\"id_disc_".$i."\"><option value=\"0\"></option>" ;
           For ($j = 0 ; $j < SQL_nbr_lignes ($disciplines) ; $j++)
            {
	     $disc = SQL_tableau_associatif ($disciplines, "") ;
             $l .= "<option value=\"".$disc ["id_discipline"]."\">".$disc ["nom_court"]."</option>" ;
	    }
	   $l .= "</select>" ;
	  }
        }
       Else
        {
	 $disciplines = SQL_commande ("SELECT * FROM disciplines WHERE millesime='".millesime (0)."' ORDER BY nom_court", $id_sql) ;
	 $l .= "&nbsp;<select name=\"id_disc_".$i."\"><option value=\"0\">Aucune discipline d&eacute;tect&eacute;e (".$sp ["code_disc"].")</option>" ;
         For ($j = 0 ; $j < SQL_nbr_lignes ($disciplines) ; $j++)
          {
	   $disc = SQL_tableau_associatif ($disciplines, "") ;
           $l .= "<option value=\"".$disc ["id_discipline"]."\">".$disc ["nom_court"]."</option>" ;
	  }
	 $l .= "</select>" ;
	}
       $l .= "&nbsp;</font></td>" ;
       $l .= "<td align=\"center\">" ;
       $l .= "<a href=\"".$action."?requete=Effacer&id_service_prof=".$sp ["id_service_prof"]."&id_service_classe=".$sc ["id_service_classe"]."&id_groupe_classe=".$gc [1]."\">" ;
       $l .= "<img src=\"".$img_sup."\" title=\"Supprimer\" border=\"0\"></A></td>" ;
       $l .= "</tr>" ;
      }
     $l .= "<tr>" ;
     $l .= "<td colspan=\"5\" align=\"center\"><input type=\"image\" src=\"".$img_val."\" title=\"Valider\" name=\"requete\" value=\"Valider\" border=\"0\"></td>" ;
     $l .= "<td colspan=\"2\" align=\"right\"><input type=\"image\" src=\"".$img_ann."\" title=\"Annuler\" name=\"requete\" value=\"Annuler\" border=\"0\"></td>" ;
     $l .= "</tr>" ;
     $l .= "</table>" ;
     $l .= "</form>" ;
    }
   Else
    {
     $l  = "<table align=\"center\" border=\"1\" bgcolor=\"".$cf."\" cellpadding=\"0\" cellspacing=\"0\">" ;
     $l .= "<tr>" ;
     $l .= "<td align=\"center\" colspan=\"3\"><font size=\"".$tf."\">&nbsp;&nbsp;Aucune&nbsp;r&eacute;paration&nbsp;n'est&nbsp;&agrave;&nbsp;faire&nbsp;!&nbsp;&nbsp;</font></td>" ;
     $l .= "</tr>" ;
     $l .= "</table>" ;
    }
   Return $l ;
  }
 
 /**
 * Verification de la base de tous les codes disciplines 
 * @param string $tf Taille de la poilice de caractere
 * @return string Rapport en HTML
 */
 Function verification_codes_disciplines_par_id ($tf)
  {
   Global $id_sql ;
   
   $disciplines = SQL_commande ("SELECT * FROM disciplines WHERE millesime='".millesime (0)."' ORDER BY nom_long", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($disciplines) ; $i++)
    {
     $disc = SQL_tableau_associatif ($disciplines, "") ;
     $ok = SQL_commande ("UPDATE appreciations SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE controles SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE groupes_classe SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE groupes_eleve SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE options_eleve SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE services_classe SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $ok = SQL_commande ("UPDATE services_prof SET code_disc='".$disc ["code"]."' WHERE discipline='".$disc ["id_discipline"]."' AND millesime='".millesime (0)."'", $id_sql) ;
    }
   $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= "<tr><td align=\"center\">" ;
   $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;".SQL_nbr_lignes ($disciplines)."&nbsp;discipline(s)&nbsp;v&eacute;rifi&eacute;e(s)&nbsp;!&nbsp;&nbsp;</font><br>" ;
   $l .= "</td></tr></table>" ;
   Return $l ;
  }
 
 /**
 * Verification de la base de tous les groupes de classe
 * @param string $tf Taille de la poilice de caractere
 * @return string Rapport en HTML
 */
 Function verification_groupes_classe_par_id ($tf)
  {
   Global $id_sql ;
   
   $grp_classe = SQL_commande ("SELECT * FROM groupes_classe WHERE service_classe='0' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($grp_classe) ; $i++)
    {
     $grp = SQL_tableau_associatif ($grp_classe, "") ;
     $serv_prof = SQL_commande ("SELECT service_classe FROM services_prof
                                  WHERE discipline='".$grp ["discipline"]."' AND classe='".$grp ["classe"]."'
				    AND groupe_classe='".$grp ["id_groupe_classe"]."' AND millesime='".millesime (0)."'", $id_sql) ;
     $sp = SQL_ligne_suivante ($serv_prof) ;
     $ok = SQL_commande ("UPDATE groupes_classe SET service_classe='".$sp [0]."' WHERE id_groupe_classe='".$grp ["id_groupe_classe"]."' LIMIT 1", $id_sql) ;
    }
   $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= "<tr><td align=\"center\">" ;
   If (SQL_nbr_lignes ($grp_classe) > 0)
    {
     $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;".SQL_nbr_lignes ($grp_classe)."&nbsp;service(s)&nbsp;v&eacute;rifi&eacute;e(s)&nbsp;!&nbsp;&nbsp;</font>" ;
    }
   Else
    {
     $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;Tout&nbsp;est&nbsp;correct&nbsp;!&nbsp;&nbsp;</font>" ;
    }
   $l .= "</td></tr></table>" ;
   Return $l ;
  }

 /**
 * Purge l'ensemble des services prof et classe
 * @param string $tf Taille de la poilice de caractere
 * @return string Rapport en HTML
 */
 Function purge_services ($tf)
  {
   Global $id_sql ;
   $millesime = millesime (0) ;
   
   // Efface les services prof sans relation
   $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($services_prof) ; $i++)
    {
     $sp = SQL_tableau_associatif ($services_prof, "") ;
     // Verification de la classe
     $efface_service = 0 ;
     $classe = SQL_commande ("SELECT id_classe FROM classes WHERE id_classe='".$sp ["classe"]."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($classe) == 0) { $efface_service = 1 ; }
     $services_classe = SQL_commande ("SELECT id_service_classe FROM services_classe WHERE id_service_classe='".$sp ["service_classe"]."'" , $id_sql) ;
     If ((SQL_nbr_lignes ($services_classe) == 0) Or ($efface_service == 1))
      {
       If ($sp ["groupe_classe"] > 0)
        {
         $groupes_classe = SQL_commande ("SELECT id_groupe_classe FROM services_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1" , $id_sql) ;
	 If (SQL_nbr_lignes ($groupes_classe) > 0)
          {
	   $ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$sp ["groupe_classe"]."' LIMIT 1", $id_sql) ;
	  }
        }
       $ok = SQL_commande ("DELETE FROM services_prof WHERE id_service_prof='".$sp ["id_service_prof"]."' LIMIT 1", $id_sql) ;
       If (SQL_nbr_lignes ($services_classe) == 1)
        {
	 $sc = SQL_ligne_suivante ($services_classe) ;
	 $ok = SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$sc [0]."' LIMIT 1", $id_sql) ;
	}
      }
    }

   // Efface les services classe sans relation
   $services_classe = SQL_commande ("SELECT * FROM services_classe ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($services_classe) ; $i++)
    {
     $sc = SQL_tableau_associatif ($services_classe, "") ;
     $services_prof = SQL_commande ("SELECT id_service_prof FROM services_prof WHERE service_classe='".$sc ["id_service_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
     If (SQL_nbr_lignes ($services_prof) == 0)
      {
       $ok = SQL_commande ("DELETE FROM services_classe WHERE id_service_classe='".$sc ["id_service_classe"]."' LIMIT 1", $id_sql) ;
      }
    }

   // Efface les groupes classe sans relation
   $groupes_classe = SQL_commande ("SELECT * FROM groupes_classe WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   For ($i = 0 ; $i < SQL_nbr_lignes ($groupes_classe) ; $i++)
    {
     $sc = SQL_tableau_associatif ($groupes_classe, "") ;
     $services_classe = SQL_commande ("SELECT id_service_classe FROM services_classe WHERE id_service_classe='".$sc ["service_classe"]."'", $id_sql) ;
     If (SQL_nbr_lignes ($services_classe) == 0)
      {
       $ok = SQL_commande ("DELETE FROM groupes_classe WHERE id_groupe_classe='".$sc ["id_groupe_classe"]."' LIMIT 1", $id_sql) ;
      }
    }
   
   // Verification des id services classe dans services prof
   // S'il y en a plusieurs alors probleme
   $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   $i = 0 ;
   While ($i <= SQL_nbr_lignes ($services_prof))
    {
     $i++ ;
     $sp = SQL_tableau_associatif ($services_prof, "") ;
     // Recherche d'un numero de service classe identique dans services_prof
     $services_double = SQL_commande ("SELECT * FROM services_prof WHERE id_service_prof!='".$sp ["id_service_prof"]."' AND service_classe='".$sp ["service_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
     If (SQL_nbr_lignes ($services_double) > 0)
      {
       For ($j = 0 ; $j < SQL_nbr_lignes ($services_double) ; $j++)
        {
	 $sd = SQL_tableau_associatif ($services_double, "") ;
	 $serv_classe = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$sd ["service_classe"]."' LIMIT 1", $id_sql) ;
         $sc = SQL_tableau_associatif ($serv_classe, "") ;
         $ok = SQL_commande ("INSERT INTO services_classe (classe,code_classe,discipline,code_disc,optionnelle,groupe,millesime)
                               VALUES ('".$sc ["classe"]."','".$sc ["code_classe"]."','".$sc ["discipline"]."','".$sc ["code_disc"]."',
				    '".$sc ["optionnelle"]."','".$sc ["groupe"]."','".$millesime."')", $id_sql) ;
         $serv_classe = SQL_commande ("SELECT id_service_classe FROM services_classe
                                        WHERE id_service_classe!='".$sd ["service_classe"]."'
				          AND classe='".$sc ["classe"]."' AND code_classe='".$sc ["code_classe"]."'
					  AND discipline='".$sc ["discipline"]."' AND code_disc='".$sc ["code_disc"]."'
					  AND optionnelle='".$sc ["optionnelle"]."' AND groupe='".$sc ["groupe"]."' AND millesime='".$millesime."'
				     ORDER BY id_service_classe", $id_sql) ;
         For ($k = 0 ; $k < SQL_nbr_lignes ($serv_classe) ; $k++)
	  {
           $sc = SQL_tableau_associatif ($serv_classe, "") ;
          }
         $ok = SQL_commande ("UPDATE services_prof SET service_classe='".$sc ["id_service_classe"]."' WHERE id_service_prof='".$sp ["id_service_prof"]."' LIMIT 1", $id_sql) ;
	}
       $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
       $i = 0 ;
      }
    }
   
   // Verification des id groupes classe dans services prof
   // S'il y en a plusieurs alors probleme
   $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   $i = 0 ;
   While ($i <= SQL_nbr_lignes ($services_prof))
    {
     $i++ ;
     $sp = SQL_tableau_associatif ($services_prof, "") ;
     If ($sp ["groupe_classe"] > 0)
      {
       // Recherche d'un numero de service classe identique dans services_prof
       $groupes_double = SQL_commande ("SELECT * FROM services_prof WHERE id_service_prof!='".$sp ["id_service_prof"]."'
				  	   AND groupe_classe='".$sp ["groupe_classe"]."' AND millesime='".$millesime."'", $id_sql) ;
       If (SQL_nbr_lignes ($groupes_double) > 0)
        {
         For ($j = 0 ; $j < SQL_nbr_lignes ($groupes_double) ; $j++)
          {
  	   $gd = SQL_tableau_associatif ($groupes_double, "") ;
	   $groupe_classe = SQL_commande ("SELECT * FROM groupes_classe WHERE id_groupe_classe='".$gd ["groupe_classe"]."' LIMIT 1", $id_sql) ;
           $gc = SQL_tableau_associatif ($groupe_classe, "") ;
           $ok = SQL_commande ("INSERT INTO groupes_classe (code_groupe,classe,code_classe,discipline,code_disc,service_classe,millesime)
                                 VALUES ('".$gc ["code_groupe"]."','".$gc ["classe"]."','".$gc ["code_classe"]."',
				    '".$gc ["discipline"]."','".$gc ["code_disc"]."','".$gc ["service_classe"]."','".$millesime."')", $id_sql) ;
           $groupe_classe = SQL_commande ("SELECT id_groupe_classe FROM groupes_classe
                                            WHERE id_groupe_classe!='".$gd ["groupe_classe"]."'
				  	      AND code_groupe='".$gc ["code_groupe"]."' AND classe='".$gc ["classe"]."'
				  	      AND code_classe='".$gc ["code_classe"]."' AND discipline='".$gc ["discipline"]."'
					      AND code_disc='".$gc ["code_disc"]."' AND service_classe='".$gc ["service_classe"]."' AND millesime='".$millesime."'
				         ORDER BY id_groupe_classe", $id_sql) ;
           For ($k = 0 ; $k < SQL_nbr_lignes ($groupe_classe) ; $k++)
	    {
             $gc = SQL_tableau_associatif ($groupe_classe, "") ;
            }
           $ok = SQL_commande ("UPDATE services_prof SET groupe_classe='".$gc ["id_groupe_classe"]."' WHERE id_service_prof='".$sp ["id_service_prof"]."' LIMIT 1", $id_sql) ;
	  }
         $services_prof = SQL_commande ("SELECT * FROM services_prof WHERE millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
         $i = 0 ;
        }
      }
    }

   // Verification des doublons entre service prof et service classe
   $sp = SQL_commande ("SELECT s.id_service_prof,p.id_service_prof,s.classe,p.classe,s.discipline,p.discipline FROM services_prof s,services_prof p WHERE s.id_service_prof!=p.id_service_prof AND s.service_classe=p.service_classe", $id_sql) ;
   $nbr_sp = SQL_nbr_lignes ($sp) ;
   If ($nbr_sp > 0)
    {
     For ($i = 0 ; $i < $nbr_sp ; $i++)
      {
       $l = SQL_ligne_suivante ($sp) ;
       Echo $l [0]."-".$l [1]."->".$l [2]."-".$l [3]."=>".$l [4]."-".$l [5]."<br>" ;
      }
    }

   // Verification du classement (si existe)
   // Filtrage
   $filtrage = SQL_commande ("SELECT DISTINCT a.id_classement,a.id_classe,a.id_service_classe,a.numero FROM classement a,classement b
                               WHERE a.id_classe=b.id_classe AND a.id_service_classe=b.id_service_classe AND a.id_classement!=b.id_classement
			         AND a.millesime='".$millesime."' AND b.millesime='".$millesime."'
		            ORDER BY a.id_classe,a.id_service_classe,a.numero", $id_sql) ;
   $nbr_f = SQL_nbr_lignes ($filtrage) ;
   If ($nbr_f > 0)
    {
     $id_classement [0][0] = 0 ;
     $l1 = SQL_ligne_suivante ($filtrage) ;
     For ($i = 1 ; $i < $nbr_f ; $i++)
      {
       $l2 = SQL_ligne_suivante ($filtrage) ;
       If (($l1 [0] != $l2 [0]) And ($l1 [1] == $l2 [1]) And ($l1 [2] == $l2 [2]))
        {
	 $id_classement [0][0]++ ;
	 $id_classement [$id_classement [0][0]][0] = $l1 [0] ; // Id_classement
	 $id_classement [$id_classement [0][0]][1] = $l1 [1] ; // Id_classe
	 $id_classement [$id_classement [0][0]][0] = $l1 [2] ; // Id_service_classe
         //$ok = SQL_commande ("DELETE FROM classement WHERE id_classement='".$l1 [0]."' LIMIT 1", $id_sql) ;
	 // Recherche de la discipline, service prof,
	 $car1 = SQL_commande ("SELECT classe,discipline FROM services_classe WHERE id_service_classe='".$l1 [2]."' LIMIT 1", $id_sql) ;
	 If (SQL_nbr_lignes ($car1) == 1)
	  {
	   $cars = SQL_ligne_suivante ($car1) ;
	   // Recherche meme discipline pour meme classe
	   $car2 = SQL_commande ("SELECT s.id_service_classe FROM services_classe s,classement c
	                           WHERE s.id_service_classe>'".$l1 [2]."' AND s.classe='".$cars [0]."' AND s.discipline='".$cars [1]."'
				     AND s.id_service_classe!=c.id_service_classe AND s.millesime='".$millesime."' AND c.millesime='".$millesime."' LIMIT 1", $id_sql) ;
	   If (SQL_nbr_lignes ($car2) == 1)
	    {
	     $cars = SQL_ligne_suivante ($car2) ;
	     $ok = SQL_commande ("UPDATE classement SET id_service_classe='".$cars [0]."' WHERE id_classement='".$l1 [0]."' LIMIT 1", $id_sql) ;
	     //echo "UPDATE classement SET id_service_classe='".$cars [0]."' WHERE id_classement='".$l1 [0]."' LIMIT 1<br>" ;
	    }
	  }
	 Else
	  {
	   // Pas de discipline correspondante -> On detruit	   
	   $ok = SQL_commande ("DELETE FROM classement WHERE id_classement='".$l1 [0]."' LIMIT 1", $id_sql) ;
	   //echo "DELETE FROM classement WHERE id_classement='".$l1 [0]."' LIMIT 1<br>" ;
	  }
        }
       $l1 = $l2 ;
      }
    }
   // Verification qu'il y a autant de discipline classees que de service prof ou classe
   $classes = SQL_commande ("SELECT DISTINCT c.id_classe FROM classes c,classement m WHERE c.id_classe=m.id_classe ORDER BY c.id_classe", $id_sql) ;
   //echo "SELECT DISTINCT c.id_classe FROM classes c,classement m WHERE c.id_classe=m.id_classe ORDER BY c.id_classe<br>" ;
   $nbr_classes = SQL_nbr_lignes ($classes) ;
   For ($i = 0 ; $i < $nbr_classes ; $i++)
    {
     $classe = SQL_ligne_suivante ($classes) ;
     $cl = SQL_commande ("SELECT COUNT(id_classement) FROM classement WHERE id_classe='".$classe [0]."'", $id_sql) ;
     $nombre_cl = SQL_ligne_suivante ($cl) ;
     $sc = SQL_commande ("SELECT COUNT(id_service_classe) FROM services_classe WHERE classe='".$classe [0]."'", $id_sql) ;
     $nombre_sc = SQL_ligne_suivante ($sc) ;
     $sp = SQL_commande ("SELECT COUNT(id_service_prof) FROM services_prof WHERE classe='".$classe [0]."'", $id_sql) ;
     $nombre_sp = SQL_ligne_suivante ($sp) ;
     If ($nombre_cl > 0)
      {
       If ((($nombre_cl [0] >= $nombre_sc [0]) And ($nombre_sc [0] >= $nombre_sp [0])) Or (($nombre_cl [0] >= $nombre_sp [0]) And ($nombre_sp [0] >= $nombre_sc [0])))
        {
	 // Ok
	}
       Else
        {
	 // Il en manque
	 //echo $nombre_cl [0]."->".$nombre_sc [0]."->".$nombre_sp [0]."->Il en manque sur ".$classe [0]."<br>" ;
	}
      }
    }
   
   $services_prof = SQL_commande ("SELECT COUNT(id_service_prof) FROM services_prof WHERE millesime='".$millesime."'", $id_sql) ;
   $nbr_services_prof = SQL_ligne_suivante ($services_prof) ;
   $services_classe = SQL_commande ("SELECT COUNT(id_service_classe) FROM services_classe WHERE millesime='".$millesime."'", $id_sql) ;
   $nbr_services_classe = SQL_ligne_suivante ($services_classe) ;
   $groupes_classe = SQL_commande ("SELECT COUNT(id_groupe_classe) FROM groupes_classe WHERE millesime='".$millesime."'", $id_sql) ;
   $nbr_groupes_classe = SQL_ligne_suivante ($groupes_classe) ;
   $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" ;
   $l .= "<tr><td align=\"center\" colspan=\"3\">" ;
   $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;Base&nbsp;v&eacute;rifi&eacute;e&nbsp;!&nbsp;&nbsp;</font>" ;
   $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;Il&nbsp;y&nbsp;a&nbsp;".$nbr_services_prof [0]."&nbsp;service(s)&nbsp;professeur&nbsp;&nbsp;</font>" ;
   $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;Il&nbsp;y&nbsp;a&nbsp;".$nbr_services_classe [0]."&nbsp;service(s)&nbsp;classe&nbsp;&nbsp;</font>" ;
   $l .= "<br><font size=\"".$tf."\">&nbsp;&nbsp;Il&nbsp;y&nbsp;a&nbsp;".$nbr_groupes_classe [0]."&nbsp;groupe(s)&nbsp;classe&nbsp;&nbsp;</font><br>" ;
   $l .= "</td></tr></table>" ;
   Return $l ;
  }
 
 /**
 * Liste des eleves sans Numero national
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @param string $ct Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $cl Couleur d'une ligne sur deux dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function liste_eleves_sans_num_nat ($tf, $ct, $cf, $cl)
  {
   Global $id_sql ;
   // Efface les services prof sans relation
   $eleves = SQL_commande ("SELECT * FROM eleves WHERE repere2='' AND exterieur='0' AND millesime='".millesime (0)."' ORDER BY nom,prenoms", $id_sql) ;
   $nbre = SQL_nbr_lignes ($eleves) ;
   If ($nbre > 0)
    {
     If ($nbre > 0)
      {
       $l  = "<table align=\"center\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"".$cf."\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
       $l .= "<tr bgcolor=\"".$ct."\"><td>&nbsp;<b>Nom</b>&nbsp;</td><td>&nbsp;<b>Pr&eacute;nom</b>&nbsp;</td><td align=\"center\">&nbsp;<b>Num&nbsp;GEP</b>&nbsp;</td></tr>" ;
       $compteur = 0 ;
       For ($i = 0 ; $i < $nbre ; $i++)
        {
         $el = SQL_tableau_associatif ($eleves, "") ;
         If (($el ["nom"] == "") And ($el ["prenoms"] == ""))
          {
  	   $ok = SQL_commande ("DELETE FROM eleves WHERE id_eleve='".$el ["id_eleve"]."' LIMIT 1", $id_sql) ;
	  }
         Else
          {
           $l .= "<tr" ;
	   If ($compteur%2) { $l .= " bgcolor=\"".$cl."\"" ; }
	   $compteur++ ;
	   $l .= "><td align=\"left\">&nbsp;<font size=\"".$tf."\">".$el ["nom"]."&nbsp;</font></td>" ;
           $l .= "<td align=\"left\"><font size=\"".$tf."\">".$el ["prenoms"]."&nbsp;</font></td>" ;
           $l .= "<td align=\"center\"><font size=\"".$tf."\">".$el ["repere1"]."&nbsp;</font></td>" ;
           $l .= "</tr>" ;
  	  }
        }
       $l .= "</table>" ;
      }
     Else
      {
       $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"".$cf."\">" ;
       $l .= "<tr bgcolor=\"".$ct."\"><td align=\"center\">Tout est OK !</td></tr>" ;
       $l .= "</table>" ;
      }
    }
   Return $l ;
  }
 
 /**
 * Liste des eleves sans Photo
 * @param string $tf Taille de la police de caracteres utilise dans le tableau du rapport
 * @param string $ct Couleur de fond de la ligne d'entete du tableau du rapport
 * @param string $cf Couleur de fond du tableau du rapport
 * @param string $cl Couleur d'une ligne sur deux dans le tableau du rapport
 * @return string Rapport en HTML
 */
 Function liste_eleves_sans_photo ($tf, $ct, $cf, $cl)
  {
   Global $id_sql, $repertoire_racine ;
   
   // Efface les services prof sans relation
   $eleves = SQL_commande ("SELECT e.nom,e.prenoms,e.photo,e.code_classe,c.nom AS nom_classe,c.nom_bref FROM eleves e, classes c
                             WHERE e.exterieur='0' AND e.classe=c.id_classe AND c.millesime='".millesime (0)."' ORDER BY e.code_classe,e.nom,e.prenoms", $id_sql) ;
   $nbre = SQL_nbr_lignes ($eleves) ;
   If ($nbre > 0)
    {
     $ok = 0 ;
     $compteur = 0 ;
     For ($i = 0 ; $i < $nbre ; $i++)
      {
       $ligne = SQL_tableau_associatif ($eleves, "") ;
       If (($ligne ["photo"]) And (File_Exists ($repertoire_racine."/images/eleves/".$ligne ["photo"])))
        {
	}
       Else
        {
	 If ($ok == 0)
          {
           $l  = "<table align=\"center\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"".$cf."\" style=\"border:1px solid #000000;border-collapse:collapse\">" ;
           $l .= "<tr bgcolor=\"".$ct."\"><td colspan=\"2\" align=\"center\">&nbsp;<b>Nom</b>&nbsp;</td><td>&nbsp;<b>Pr&eacute;noms</b>&nbsp;</td><td align=\"center\">&nbsp;<b>Classe</b>&nbsp;</td></tr>" ;
  	   $ok = 1 ;
	   $cc = $ligne ["code_classe"] ;
	   $coul = 1 ;
	  }
	 If ($cc <> $ligne ["code_classe"])
	  {
	   $cc = $ligne ["code_classe"] ;
	   If ($coul == 1) { $rjt .= " bgcolor=\"".$cl."\"" ; $coul = 0 ; } Else { $rjt = "" ; $coul = 1 ; }
	  }
	 $l .= "<tr".$rjt.">" ;
	 $compteur++ ;
	 $l .= "<td align=\"right\">&nbsp;<font size=\"".$tf."\">".$compteur."&nbsp;</font></td>" ;
         $l .= "<td>&nbsp;<font size=\"".$tf."\">".$ligne ["nom"]."&nbsp;</font></td>" ;
         $l .= "<td><font size=\"".$tf."\">".$ligne ["prenoms"]."&nbsp;</font></td>" ;
         $l .= "<td><font size=\"".$tf."\">".$ligne ["nom_classe"]."&nbsp;(".$ligne ["nom_bref"].")&nbsp;</font></td>" ;
         $l .= "</tr>" ;
        }
      }
     If ($ok > 0) { $l .= "</table>\n" ; }
     Else
      {
       $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"".$cf."\">" ;
       $l .= "<tr bgcolor=\"".$ct."\"><td align=\"center\">Aucune photo n'a &eacute;t&eacute; oubli&eacute;e !</td></tr>" ;
       $l .= "</table>" ;
      }
    }
   Else
    {
     $l  = "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"".$cf."\">" ;
     $l .= "<tr bgcolor=\"".$ct."\"><td align=\"center\">Aucun &eacute;l&egrave;ve !</td></tr>" ;
     $l .= "</table>" ;
    }
   Return $l ;
  }

 /**
 * Renvoi un tableau contenant les caracteristiques eleves pour une classe
 * @param string $id_classe Identifiant SQL de la classe
 * @return string Tableau rapport
 *         Format : [0][0]=Nbr d'eleves
 *                  [$num_eleve][0]=Id eleve
 *                  [$num_eleve][1]=Nom eleve
 *                  [$num_eleve][2]=Prenom eleve
 *                  [$num_eleve][3]=Repere 1
 *                  [$num_eleve][4]=Repere 2
 *                  [$num_eleve][5]=Repere 3
 *                  [$num_eleve][6]=Photo
 *                  [$num_eleve][7]=Etat (-1=Desactivation;0=Interne etablissement;1=Externe etablissement)
 *                  [$num_eleve][8]=Date naissance
 *                  [$num_eleve][9]=Mef
 */
 Function eleves_par_id_classe ($id_classe)
  {
   Global $id_sql ;
   $requete  = "SELECT id_eleve,nom,prenoms,repere1,repere2,repere3,photo,exterieur,date_naissance,mef " ;
   $requete .= "FROM eleves WHERE classe='".$id_classe."' ORDER BY nom,prenoms,id_eleve" ;
   $eleves = SQL_commande ($requete, $id_sql) ;
   $liste_eleves [0][0] = SQL_nbr_lignes ($eleves) ;
   If ($liste_eleves [0][0] > 0)
    {
     $nbr_champs = SQL_nbr_champs ($eleves) ;
     For ($i = 1 ; $i <= $liste_eleves [0][0] ; $i++)
      {
       $l = SQL_ligne_suivante ($eleves) ;
       For ($j = 0 ; $j < $nbr_champs ; $j++)
        {
         $liste_eleves [$i][$j] = $l [$j] ;
	}
      }
    }
   Return $liste_eleves ;
  }

 /**
 * Renvoi un tableau contenant le nombre d'eleves pour le service ($id_service_prof) d'un prof
 * @param string $id_service_prof Identifiant SQL du service enseignant
 * @return string Tableau rapport (Format : [0] = Nombre d'eleves et [1..$t [0]] = Id eleve numero j (de 1 a $t [$i][1][0]) pour le service $i)
 */
 Function eleves_par_service_classe ($id_service_prof)
  {
   Global $id_sql ;
   $nbr_eleves = 0 ;
   $liste_eleves [0] = 0 ;
   // Cherche le service prof
   $service = SQL_commande ("SELECT * FROM services_prof WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($service) == 1)
    {
     $ligne = SQL_tableau_associatif ($service, "") ;
     // Recherche service classe associe
     $serv_classe = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$ligne ["service_classe"]."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($serv_classe) == 1)
      {
       $sc = SQL_tableau_associatif ($serv_classe, "") ;
       If (($sc ["optionnelle"] == 1) Or ($sc ["groupe"] == 1))
	{
	 // Optionnelle ou groupe (ou les deux)
	 // Traite l'option
	 If ($sc ["optionnelle"] == 1)
	  {
	   // Traitement si optionnelle + groupe
	   If ($sc ["groupe"] == 1)
	    {
	     $eleves = SQL_commande ("SELECT g.eleve FROM groupes_eleve g,options_eleve o,eleves e
	                               WHERE o.discipline='".$ligne ["discipline"]."' AND o.service_classe='".$ligne ["service_classe"]."'
				         AND g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.id_eleve=o.eleve
					 AND e.classe='".$ligne ["classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve", $id_sql) ;
             $nbr = SQL_nbr_lignes ($eleves) ;
	     If ($nbr > 0)
	      {
	       $liste_eleves [0] = $nbr ;
	       For ($j = 1 ; $j <= $nbr ; $j++)
	        {
	         $l = SQL_ligne_suivante ($eleves) ;
	         $liste_eleves [$j] = $l [0] ;
	        }
	      }
             Else
	      {
	       // Option+Groupe -> Mais aucun groupe cree donc pas d'eleves
	       $liste_eleves [0] = 0 ;
	      }
	    }
	   Else
	    {
	     // Traitement OPTION SEULE AND o.code_disc='".$ligne ["code_disc"]."'
	     $eleves = SQL_commande ("SELECT o.eleve FROM options_eleve o, eleves e WHERE o.discipline='".$ligne ["discipline"]."' AND e.classe='".$ligne ["classe"]."'
					 AND e.id_eleve=o.eleve AND o.service_classe='".$ligne ["service_classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve", $id_sql) ;
	     If (SQL_nbr_lignes ($eleves) > 0)
	      {
	       $liste_eleves [0] = SQL_nbr_lignes ($eleves) ;
	       For ($j = 1 ; $j <= SQL_nbr_lignes ($eleves) ; $j++)
	        {
	         $l = SQL_ligne_suivante ($eleves) ;
	         $liste_eleves [$j] = $l [0] ;
                 
	        }
	      }
             Else
	      {
	       // Option SEULE -> Mais aucun eleves
	       $liste_eleves [0] = 0 ;
	      }
	    }
	  }
	 Else
	  {
	   // Si GROUPE sans option
	   $liste_eleves [$liste_eleves [0][0][0]][1][0] = 0 ;
	  }
	 // Traite le groupe si non optionnelle
	 If (($sc ["optionnelle"] == 0) And ($sc ["groupe"] == 1))
	  {
	   $eleves = SQL_commande ("SELECT g.eleve FROM groupes_eleve g,eleves e WHERE g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.classe='".$ligne ["classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve", $id_sql) ;
           $nbr = SQL_nbr_lignes ($eleves) ;
	   If ($nbr > 0)
	    {
	     $liste_eleves [0] = $nbr ;
	     For ($j = 1 ; $j <= $nbr ; $j++)
	      {
	       $l = SQL_ligne_suivante ($eleves) ;
	       $liste_eleves [$j] = $l [0] ;
	      }
	    }
           Else
	    {
	     // Groupe SEUL -> Mais aucun eleves
	     $liste_eleves [0] = 0 ;
	    }
	  }
	}
       Else
        {
         // Classe entiere
	 $classe = SQL_commande ("SELECT id_eleve FROM eleves WHERE classe='".$ligne ["classe"]."' AND exterieur>='0' ORDER BY nom,prenoms,id_eleve", $id_sql) ;
         $nbr = SQL_nbr_lignes ($classe) ;
	 If ($nbr > 0)
	  {
	   $liste_eleves [0] = $nbr ;
	   For ($j = 1 ; $j <= $nbr ; $j++)
	    {
	     $l = SQL_ligne_suivante ($classe) ;
	     $liste_eleves [$j] = $l [0] ;
	    }
	  }
         Else
	  {
	   // Pas d'eleves dans la classe
	   $liste_eleves [0] = 0 ;
	  }
	}
      }
     Else
      {
       // Pas de service classe associe
       $liste_eleves [0] = 0 ;
      }
    }
   Else
    {
     // Pas de service prof
     $liste_eleves [0] = 0 ;
    }
   Return $liste_eleves ;
  }
 
 /**
 * Renvoi un tableau contenant les caracteristiques eleves pour le service d'un prof
 * @param string $id_service_prof Identifiant SQL du service enseignant
 * @return string Tableau rapport
 *         Format : [0][0]=Nbr d'eleves
 *                  [0][1]=Optionnelle
 *                  [$num_eleve][0]=Id eleve
 *                  [$num_eleve][1]=Nom eleve
 *                  [$num_eleve][2]=Prenom eleve
 *                  [$num_eleve][3]=Repere 1
 *                  [$num_eleve][4]=Repere 2
 *                  [$num_eleve][5]=Repere 3
 */
 Function caracteristiques_eleves_par_service_classe ($id_service_prof)
  {
   Global $id_sql ;
   $liste_eleves [0][0] = 0 ;
   // Cherche le service prof et service classe associe
   $service = SQL_commande ("SELECT s.discipline,s.service_classe,s.groupe_classe,s.classe,c.optionnelle,c.groupe FROM services_prof s,services_classe c WHERE s.id_service_prof='".$id_service_prof."' AND s.service_classe=c.id_service_classe LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($service) == 1)
    {
     $ligne = SQL_tableau_associatif ($service, "") ;
     If (($ligne ["optionnelle"] == 1) Or ($ligne ["groupe"] == 1))
      {
       // Optionnelle ou groupe (ou les deux)
       If ($ligne ["optionnelle"] == 1)
        {
         // Traitement si optionnelle + groupe
         If ($ligne ["groupe"] == 1)
          {
           $requete  = "SELECT e.id_eleve,e.nom,e.prenoms,e.repere1,e.repere2,e.repere3 FROM groupes_eleve g,options_eleve o,eleves e ";
           $requete .= "WHERE o.discipline='".$ligne ["discipline"]."' AND o.service_classe='".$ligne ["service_classe"]."' " ;
           $requete .= "AND g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.id_eleve=o.eleve " ;
           $requete .= "AND e.classe='".$ligne ["classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve" ;
          }
         Else
          {
           // Traitement OPTION SEULE
           $requete  = "SELECT e.id_eleve,e.nom,e.prenoms,e.repere1,e.repere2,e.repere3 FROM options_eleve o,eleves e " ;
           $requete .= "WHERE o.discipline='".$ligne ["discipline"]."' AND e.classe='".$ligne ["classe"]."' AND e.id_eleve=o.eleve " ;
           $requete .= "AND o.service_classe='".$ligne ["service_classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve" ;
          }
        }
       ElseIf ($ligne ["groupe"] == 1)
        {
         // Traite le groupe si non optionnelle
         $requete  = "SELECT e.id_eleve,e.nom,e.prenoms,e.repere1,e.repere2,e.repere3 FROM groupes_eleve g,eleves e " ;
         $requete .= "WHERE g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.classe='".$ligne ["classe"]."' AND e.exterieur>='0' ORDER BY e.nom,e.prenoms,e.id_eleve" ;
        }
      }
     Else
      {
       // Classe entiere
       $requete = "SELECT id_eleve,nom,prenoms,repere1,repere2,repere3 FROM eleves WHERE classe='".$ligne ["classe"]."' AND exterieur>='0' ORDER BY nom,prenoms,id_eleve" ;
      }
     // Traitement resultats
     $eleves = SQL_commande ($requete, $id_sql) ;
     $liste_eleves [0][0] = SQL_nbr_lignes ($eleves) ;
     $liste_eleves [0][1] = $ligne ["optionnelle"] ;
     For ($j = 1 ; $j <= $liste_eleves [0][0] ; $j++)
      {
       $l = SQL_ligne_suivante ($eleves) ;
       $liste_eleves [$j][0] = $l [0] ;
       $liste_eleves [$j][1] = $l [1] ;
       $liste_eleves [$j][2] = $l [2] ;
       $liste_eleves [$j][3] = $l [3] ;
       $liste_eleves [$j][4] = $l [4] ;
       $liste_eleves [$j][5] = $l [5] ;
      }
    }
   Return $liste_eleves ;
  }
 
 /**
 * Renvoi un tableau contenant le nombre d'eleves pour tous les services d'un prof (id)
 * @param int $id Identifiant SQL du service enseignant
 * @return array Format : [0][0][0] = Nombre de services 
 *  [][0][0] = Id service prof pour le service $i
 *  [][0][1] = Id service classe pour le service $i
 *  [][0][2] = Id groupe classe pour le service $i
 *  [][0][3] = Id discipline pour le service $i
 *  [][0][4] = Id classe pour le service $i
 *  [][0][5] = Id sous-discipline pour le service $i
 *  [][1][0] = Nombre d'eleves pour l'option ou le groupe (voir optionnelle) du service $i
 *  [][1][1..$t [$i][1][0]] = Id eleve numero j (de 1 a $t [$i][1][0]) pour le service $i
 */
 Function eleves_par_prof ($id)
  {
   Global $id_sql, $debug_SQL ;
   $nbr_eleves = 0 ;
   $liste_eleves [0][0][0] = 0 ;
   $millesime = millesime (0) ;
   // Cherche le service prof
   //$service = SQL_commande ("SELECT * FROM services_prof WHERE professeur='".$id."' AND millesime='".$millesime."' ORDER BY code_classe", $id_sql) ;
   // Chercher si alias possible
   $alias_s = SQL_commande("SELECT id_service_prof FROM groupes_alias WHERE id_utilisateur='".$id."' AND code='1' AND millesime='".$millesime."'", $id_sql) ;
   $nbr_alias = SQL_nbr_lignes ($alias_s) ;
   $requete = "SELECT DISTINCT * FROM services_prof WHERE " ; If ($nbr_alias > 0) { $requete .= "(" ; }
   $requete .= "professeur='".$id."' AND millesime='".$millesime."'" ;
   If ($nbr_alias > 0)
    {
     $requete .= ")" ;
     For ($i = 0 ; $i < $nbr_alias ; $i++)
      {
       $ligne = SQL_ligne_suivante ($alias_s) ;
       $requete .= " OR (id_service_prof='".$ligne [0]."')" ;
      }
    }
   $requete .= " ORDER BY code_classe" ;
   $service = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($service) > 0)
    {
     // Parcours les services prof
     For ($i = 0 ; $i < SQL_nbr_lignes ($service) ; $i++)
      {
       $ligne = SQL_tableau_associatif ($service, "") ;
       // Recherche service classe
       $serv_classe = SQL_commande ("SELECT * FROM services_classe WHERE id_service_classe='".$ligne ["service_classe"]."' AND discipline='".$ligne ["discipline"]."'", $id_sql) ;
       If (SQL_nbr_lignes ($serv_classe) == 1)
        {
         $sc = SQL_tableau_associatif ($serv_classe, "") ;
	 If (($sc ["optionnelle"] == 1) Or ($sc ["groupe"] == 1))
	  {
	   // Optionnelle ou groupe (ou les deux d'ailleurs)
	   // Traite l'option
	   If ($sc ["optionnelle"] == 1)
	    {
	     // Traitement si optionnelle + groupe avec le groupe en priorite
	     If ($sc ["groupe"] == 1)
	      {
	       $eleves = SQL_commande ("SELECT g.eleve FROM groupes_eleve g,eleves e WHERE g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.millesime='".$millesime."' AND e.exterieur>='0'
				      ORDER BY e.nom,e.prenoms", $id_sql) ;
	       $nbre = SQL_nbr_lignes ($eleves) ;
	       If ($nbre > 0)
	        {
	         $liste_eleves [0][0][0]++ ;
		 $liste_eleves [$liste_eleves [0][0][0]][0][0] = $ligne ["id_service_prof"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][1] = $ligne ["service_classe"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][2] = $ligne ["groupe_classe"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][3] = $ligne ["discipline"] ;
		 $liste_eleves [$liste_eleves [0][0][0]][0][4] = $sc ["classe"] ;
		 $liste_eleves [$liste_eleves [0][0][0]][0][5] = $ligne ["sous_discipline"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][1][0] = $nbre ;
	         For ($j = 1 ; $j <= $nbre ; $j++)
	          {
	           $lgn = SQL_ligne_suivante ($eleves) ;
	           $liste_eleves [$liste_eleves [0][0][0]][1][$j] = $lgn [0] ;
	          }
	        }
               Else
	        {
		 //$liste_eleves [$liste_eleves [0][0][0]][1][0] = 0 ;
	        }
	      }
	     Else
	      {
	       // Traitement optionnelle seule
	       $eleves = SQL_commande ("SELECT o.eleve FROM options_eleve o,eleves e WHERE o.discipline='".$ligne ["discipline"]."' AND o.code_disc='".$ligne ["code_disc"]."'
					   AND e.classe='".$ligne ["classe"]."' AND e.id_eleve=o.eleve AND e.millesime='".$millesime."' AND e.exterieur>='0'
				      ORDER BY e.nom,e.prenoms", $id_sql) ;
	       $nbre = SQL_nbr_lignes ($eleves) ;
	       If ($nbre > 0)
	        {
	         $liste_eleves [0][0][0]++ ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][0] = $ligne ["id_service_prof"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][1] = $ligne ["service_classe"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][2] = $ligne ["groupe_classe"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][0][3] = $ligne ["discipline"] ;
		 $liste_eleves [$liste_eleves [0][0][0]][0][4] = $sc ["classe"] ;
		 $liste_eleves [$liste_eleves [0][0][0]][0][5] = $ligne ["sous_discipline"] ;
	         $liste_eleves [$liste_eleves [0][0][0]][1][0] = $nbre ;
	         For ($j = 1 ; $j <= $nbre ; $j++)
	          {
	           $lgn = SQL_ligne_suivante ($eleves) ;
	           $liste_eleves [$liste_eleves [0][0][0]][1][$j] = $lgn [0] ;
	          }
	        }
               Else
	        {
		 //$liste_eleves [$liste_eleves [0][0][0]][1][0] = 0 ;
		}
	      }
	    }
	   Else
	    {
	     //$liste_eleves [$liste_eleves [0][0][0]][1][0] = 0 ;
	    }
	   // Traite le groupe si non optionnelle
	   If (($sc ["optionnelle"] == 0) And ($sc ["groupe"] == 1))
	    {
	     $eleves = SQL_commande ("SELECT g.eleve FROM groupes_eleve g,eleves e WHERE g.groupe='".$ligne ["groupe_classe"]."' AND g.eleve=e.id_eleve AND e.millesime='".$millesime."' AND e.exterieur>='0'
				    ORDER BY e.nom,e.prenoms", $id_sql) ;
	     $nbre = SQL_nbr_lignes ($eleves) ;
	     If ($nbre > 0)
	      {
	       $liste_eleves [0][0][0]++ ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][0] = $ligne ["id_service_prof"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][1] = $ligne ["service_classe"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][2] = $ligne ["groupe_classe"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][3] = $ligne ["discipline"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][4] = $sc ["classe"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][0][5] = $ligne ["sous_discipline"] ;
	       $liste_eleves [$liste_eleves [0][0][0]][1][0] = $nbre ;
	       For ($j = 1 ; $j <= $nbre ; $j++)
	        {
	         $lgn = SQL_ligne_suivante ($eleves) ;
	         $liste_eleves [$liste_eleves [0][0][0]][1][$j] = $lgn [0] ;
	        }
	      }
             Else
	      {
	       //$liste_eleves [$liste_eleves [0][0][0]][1][0] = 0 ;
	      }
	    }
	  }
	 Else
	  {
	   // Classe entiere
	   $classe = SQL_commande ("SELECT id_eleve FROM eleves WHERE classe='".$ligne ["classe"]."' AND millesime='".$millesime."' AND exterieur>='0' ORDER BY nom,prenoms", $id_sql) ;
	   $nbc = SQL_nbr_lignes ($classe) ;
	   If ($nbc > 0)
	    {
	     $liste_eleves [0][0][0]++ ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][0] = $ligne ["id_service_prof"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][1] = $ligne ["service_classe"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][2] = $ligne ["groupe_classe"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][3] = $ligne ["discipline"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][4] = $sc ["classe"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][0][5] = $ligne ["sous_discipline"] ;
	     $liste_eleves [$liste_eleves [0][0][0]][1][0] = $nbc ;
	     For ($j = 1 ; $j <= $nbc ; $j++)
	      {
	       $lgn = SQL_ligne_suivante ($classe) ;
	       $liste_eleves [$liste_eleves [0][0][0]][1][$j] = $lgn [0] ;
	      }
	    }
	  }
        }
      }
    }
   Else
    {
     $liste_eleves [0][0][0] = 0 ;
    }
   Return $liste_eleves ;
  }
 
 // ----------------------------------------------------------
 // Formatage de texte
 // ----------------------------------------------------------
 /**
 * Renvoi une chaine formatee sur x caracteres par ligne
 * @param string $chaine Chaine de caracteres a formatter
 * @param int $nbr_cols Nombre de caracteres par ligne
 * @return string Chaine formattee en HTML
 */
 Function formatage ($chaine, $nbr_cols)
  {
   $chaine = Str_Replace ("\n", "", $chaine) ;
   $tableau_mots = Explode (" ", $chaine) ;
   $chaine = $tableau_mots [0] ;
   $nbr_car = StrLen ($tableau_mots [0]) ;
   For ($i = 1 ; $i < SizeOf ($tableau_mots) ; $i++)
    {
     If (($nbr_car + StrLen ($tableau_mots [$i]) + 1) > $nbr_cols)
      {
       $chaine .= "<br>".$tableau_mots [$i] ;
       $nbr_car = StrLen ($tableau_mots [$i]) ;
      }
     Else
      {
       $chaine .= " ".$tableau_mots [$i] ;
       $nbr_car = $nbr_car + StrLen ($tableau_mots [$i]) + 1 ;
      }
    }
   Return $chaine ;
  }

 /**
 * Traduit une entree de ASCII vers ANSI
 * @param string $entree Texte a traduire en ASCII (venant de GEP par exemple)
 * @return string Chaine traduite
 */
 Function ansi ($entree)
  {
   Define ("TABLE_ANSI","�����������������������������׃�����Ѫ�������������������������");
   $resultat = "" ;
   For ($i = 0 ; $i < StrLen ($entree) ; $i++)
    {
     $car = $entree [$i] ;
     $num = Ord ($car);
     If (($num > 127) And ($num < 192)) { $car = SubStr (TABLE_ANSI, $num-128, 1) ; }
     $resultat .= $car ;
    }
   Return $resultat ;
  } 

 /**
 * Activation de l'editeur de texte
 * @param int $hauteur Hauteur en pixels
 * @param int $largeur Largeur en pixels
 * @param string $barre_outils Nom de la barre d'outils a utiliser (Simple,Message,Tout)
 * @param string $nom_theme Nom du theme a utiliser
 * @param string $valeur_defaut Valeur par defaut dans la partie saisie
 */
 Function active_editeur ($hauteur, $largeur, $barre_outils, $nom_theme, $valeur_defaut, $nom_variable)
  {
   Global $http_garennes ;
   If ($nom_variable == "") { $nom_variable = "texte" ; }
   $valeur_defaut = Str_Replace ("\n", "", $valeur_defaut) ;
   $valeur_defaut = Str_Replace ("\t", "", $valeur_defaut) ;
   $valeur_defaut = Str_Replace ("\r", "", $valeur_defaut) ;
   $ligne = "<script type=\"text/javascript\" src=\"../../images/themes/fckeditor/fckeditor.js\"></script>" ;
   $ligne .= "<script type=\"text/javascript\">" ;
   $ligne .= "var oFCKeditor=new FCKeditor('".$nom_variable."');" ;
   $ligne .= "oFCKeditor.BasePath='".$http_garennes."images/themes/fckeditor/';" ;
   $ligne .= "oFCKeditor.Config['SkinPath']='".$http_garennes."images/themes/".$nom_theme."/';";
   $ligne .= "oFCKeditor.Config['AutoDetectLanguage']=false;" ;
   $ligne .= "oFCKeditor.Config['DefaultLanguage']='fr';" ;
   $ligne .= "oFCKeditor.DisplayErrors=false;" ;
   $ligne .= "oFCKeditor.Value='".filtrage ($valeur_defaut)."';" ;
   $ligne .= "oFCKeditor.Toolbar='".$barre_outils."';" ;
   $ligne .= "oFCKeditor.ToolbarSet='".$barre_outils."';" ;
   $ligne .= "oFCKeditor.Height='".$hauteur."';" ;
   $ligne .= "oFCKeditor.Width='".$largeur."';" ;
   $ligne .= "oFCKeditor.Create();" ;
   $ligne .= "</script>" ;
   Return $ligne ;
  }
 
 /**
 * Activation de l'editeur de texte si plusieurs sur une meme page
 * @param int $hauteur Hauteur en pixels
 * @param int $largeur Largeur en pixels
 * @param string $barre_outils Nom de la barre d'outils a utiliser (Simple,Message,Tout)
 * @param string $nom_theme Nom du theme a utiliser
 * @param string $valeur_defaut Valeur par defaut dans la partie saisie
 * @param string $nom_variable Nom de la variable pour la saisie
 * @param int $numero Numero de l'editeur (Si > 1 alors pas de declaration de la source javascript)
 */
 Function active_multi_editeur ($hauteur, $largeur, $barre_outils, $nom_theme, $valeur_defaut, $nom_variable, $numero)
  {
   Global $http_garennes ;
   $valeur_defaut = Str_Replace ("\n", "", $valeur_defaut) ;
   $valeur_defaut = Str_Replace ("\t", "", $valeur_defaut) ;
   $valeur_defaut = Str_Replace ("\r", "", $valeur_defaut) ;
   If ($numero == 1) { $ligne = "<script type=\"text/javascript\" src=\"../../images/themes/fckeditor/fckeditor.js\"></script>" ; } Else { $ligne = ""; }
   $ligne .= "<script type=\"text/javascript\">" ;
   $ligne .= "var oFCKeditor".$numero."=new FCKeditor('".$nom_variable."');" ;
   $ligne .= "oFCKeditor".$numero.".BasePath='".$http_garennes."images/themes/fckeditor/';" ;
   $ligne .= "oFCKeditor".$numero.".Config['SkinPath']='".$http_garennes."images/themes/".$nom_theme."/';";
   $ligne .= "oFCKeditor".$numero.".Config['AutoDetectLanguage']=false;" ;
   $ligne .= "oFCKeditor".$numero.".Config['DefaultLanguage']='fr';" ;
   $ligne .= "oFCKeditor".$numero.".DisplayErrors=false;" ;
   $ligne .= "oFCKeditor".$numero.".Value='".filtrage ($valeur_defaut)."';" ;
   $ligne .= "oFCKeditor".$numero.".Toolbar='".$barre_outils."';" ;
   $ligne .= "oFCKeditor".$numero.".ToolbarSet='".$barre_outils."';" ;
   $ligne .= "oFCKeditor".$numero.".Height='".$hauteur."';" ;
   $ligne .= "oFCKeditor".$numero.".Width='".$largeur."';" ;
   $ligne .= "oFCKeditor".$numero.".Create();" ;
   $ligne .= "</script>" ;
   Return $ligne ;
  }

 /**
 * Lecture du flux rss depuis le serveur pre-defini et mise en page pour affichage
 * @param string $coul_fond Couleur du fond du tableau
 * @param string $coul_titre Couleur du texte du titre
 * @param string $fond_titre Couleur du fond du titre
 * @return string Mise en forme si flux existe
 */
 Function flux_rss ($coul_fond, $coul_titre, $fond_titre)
  {
   Global $adresse_flux_rss,$identification_garennes,$affichage_rss, $timeout ;
   If (@FSockOpen ($adresse_flux_rss, "80", $errno, $errstr, $timeout))
    {
     $id_flux = FOpen ($adresse_flux_rss, "r") ;
     $flux = "" ;
     While (!FEoF ($id_flux))
      {
       $flux .= FGets ($id_flux, 4096) ;
      }
     FClose ($id_flux) ;
     $ligne = "" ;
     $ok = 0 ;
     If (StrLen ($flux) > 0)
      {
       $flux_rss = $flux ;
       $titre [0] = 0 ; $lien [0] = 0 ; $description [0] = 0 ; $createur [0] = 0 ; $date_creation [0] = 0 ;
       While (StrPos ($flux_rss, "<item rdf:about") And StrPos ($flux_rss, "</item>"))
        {
         $morceau = SubStr ($flux_rss, StrPos ($flux_rss, "<item rdf:about"), StrPos ($flux_rss, "</item>")-StrPos ($flux_rss, "<item rdf:about")+1) ;
         If (StrPos ($morceau, $identification_garennes))
          {
           For ($i = 1 ; $i <= $affichage_rss [0][0] ; $i++)
            {
             If (StrPos ($morceau, $affichage_rss [$i][0]) And StrPos ($morceau, $affichage_rss [$i][1]))
              {
               $ok = 1 ;
               Switch ($affichage_rss [$i][2])
                {
                 Case 1 : $titre [0]++ ;
                          $debut = StrPos ($morceau, $affichage_rss [$i][0])+StrLen ($affichage_rss [$i][0]) ;
                          $longueur = StrLen (SubStr ($morceau, $debut, StrPos ($morceau, $affichage_rss [$i][1])-$debut)) ;
                          $titre [$titre [0]] = SubStr ($morceau, $debut, $longueur) ;
                          Break ;
                 Case 2 : $lien [0]++ ;
                          $debut = StrPos ($morceau, $affichage_rss [$i][0])+StrLen ($affichage_rss [$i][0]) ;
                          $longueur = StrLen (SubStr ($morceau, $debut, StrPos ($morceau, $affichage_rss [$i][1])-$debut)) ;
                          $lien [$lien [0]] = SubStr ($morceau, $debut, $longueur) ;
                          Break ;
                 Case 3 : $description [0]++ ;
                          $debut = StrPos ($morceau, $affichage_rss [$i][0])+StrLen ($affichage_rss [$i][0]) ;
                          $longueur = StrLen (SubStr ($morceau, $debut, StrPos ($morceau, $affichage_rss [$i][1])-$debut)) ;
                          $description [$description [0]] = SubStr ($morceau, $debut, $longueur) ;
                          Break ;
                 Case 4 : $createur [0]++ ;
                          $debut = StrPos ($morceau, $affichage_rss [$i][0])+StrLen ($affichage_rss [$i][0]) ;
                          $longueur = StrLen (SubStr ($morceau, $debut, StrPos ($morceau, $affichage_rss [$i][1])-$debut)) ;
                          $createur [$createur [0]] = SubStr ($morceau, $debut, $longueur) ;
                          Break ;
                 Case 5 : $date_creation [0]++ ;
                          $debut = StrPos ($morceau, $affichage_rss [$i][0])+StrLen ($affichage_rss [$i][0]) ;
                          $longueur = StrLen (SubStr ($morceau, $debut, StrPos ($morceau, $affichage_rss [$i][1])-$debut)) ;
                          $date_creation [$date_creation [0]] = SubStr ($morceau, $debut, $longueur) ;
                          Break ;
                }
              }
            }
          }
         $flux_rss = SubStr ($flux_rss, StrPos ($flux_rss, "</item>")+6, StrLen ($flux_rss)-StrPos ($flux_rss, "</item>")-5) ;
        }
       // Mise en forme
       If ($ok == 1)
        {
         $ligne = "<table border=\"1\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-collapse:collapse\" bgcolor=\"".$coul_fond."\">" ;
         For ($i = 1 ; $i <= $titre [0] ; $i++) 
          {
           $ligne .= "<tr bgcolor=\"".$fond_titre."\"><td>&nbsp;<font color=\"".$coul_titre."\">FIL&nbsp;RSS&nbsp;-<b>" ; If ($lien [$i]) { $ligne .= "<a href=\"".$lien [$i]."\" target=\"_blank\">" ; }
           $ligne .= "&nbsp;".Str_Replace ("\n", "", $titre [$i])."&nbsp;" ; If ($lien [$i]) { $ligne .= "</a>" ; }
           $ligne .= "</b></font></td></tr>" ;
           $ligne .= "<tr><td>&nbsp;".Str_Replace ("&amp;", "&", Str_Replace ("\n", "<br>&nbsp;", $description [$i]))."&nbsp;<br>&nbsp;<b>".$createur [$i]."</b>&nbsp;(".$date_creation [$i].")&nbsp;</td></tr>" ;
          }
         $ligne .="</table>" ;
        }
      }
     Return $ligne ;
    }
   Else { Return "" ; }
  }

 // ----------------------------------------------------------
 // Gestion des memos notes
 // ----------------------------------------------------------
 /**
 * Renvoi 1 si le memo note existe sinon 0
 * @param int $ut Id utilisateur
 * @param int $el Id _eleve
 * @param string $r1 Repere1 eleve
 * @param string $r2 Repere2 eleve
 * @return int Renvoi 1 si existe, 0 si n'existe pas
 */
 Function memo_note_existe ($ut, $el, $r1, $r2)
  {
   Global $id_sql ;
   $r0 = SQL_commande ("SELECT id_memo_note FROM memo_notes WHERE id_utilisateur='".$ut."' AND id_eleve='".$el."' AND repere1='".$r1."' AND repere2='".$r2."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r0) == 1) { Return 1 ; } Else { Return 0 ; }
  }

 /**
 * Renvoi l'id et le texte de la memo note si existe sinon 0
 * @param int $ut Id utilisateur
 * @param int $el Id _eleve
 * @param string $r1 Repere1 eleve
 * @param string $r2 Repere2 eleve
 * @return array Renvoi un tableau [0]=ID, [1]=TEXTE si existe sinon [0] = 0
 */
 Function memo_note_texte ($ut, $el, $r1, $r2)
  {
   Global $id_sql ;
   $r0 = SQL_commande ("SELECT id_memo_note,texte FROM memo_notes WHERE id_utilisateur='".$ut."' AND id_eleve='".$el."' AND repere1='".$r1."' AND repere2='".$r2."' AND millesime='".millesime (0)."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r0) == 1) { $ligne = SQL_ligne_suivante ($r0) ; } Else { $ligne [0] = 0 ; $ligne [1] = "" ; }
   Return $ligne ;
  }
 
 // ----------------------------------------------------------
 // Gestion des cahiers de textes
 // ----------------------------------------------------------
 /**
 * Renvoi 1 si le cahier de textes est actif sinon 0
 * @param int $id_classe Id classe
 * @return int Renvoi 1 si actif sinon 0
 */
 Function cahier_textes_actif ($id_classe)
  {
   Global $id_sql ;
   $r0 = SQL_commande ("SELECT e.cahier_textes FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
   $ligne = SQL_ligne_suivante ($r0) ;
   If ($ligne [0] == 1) { Return 1 ; } Else { Return 0 ; }
  }
 
 /**
 * Renvoi l'identifiant de l'etablissement en fonction de la variable globale 'cahier_textes_id'
 * @param int $id_cahier_textes Identifiant du type de visualisation (classe/etablissement/rien)
 * @return int Identifiant etablissement si OK, sinon 0
 */
 Function cahier_textes_id_etablissement ($id_cahier_textes)
  {
   Global $id_sql ;
   If ($id_cahier_textes < 0) { $id = -$id_cahier_textes ; }
   ElseIf ($id_cahier_textes > 0)
    {
     $millesime = millesime (0) ;
     $resultat = SQL_commande ("SELECT e.id_etablissement FROM etablissements e,classes c WHERE c.id_classe='".$id_cahier_textes."' AND c.etablissement=e.id_etablissement AND c.millesime='".$millesime."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1)
      {
       $etab = SQL_ligne_suivante ($resultat) ;
       $id = $etab [0] ;
      }
     Else { $id = 0 ; }
    }
   Return $id ;
  }
 /**
 * Renvoi le type d'acces au cahier de texte en fonction du serice prof
 * @param int $id_service_prof Identifiant du service prof
 * @return int 0=Pas d'acces,1=Acces public,2=Acces restreint
 */
 Function cahier_texte_type_acces_1 ($id_service_prof)
  {
   Global $id_sql ;
   $ok = SQL_commande ("SELECT e.cahier_textes,e.cahier_public FROM etablissements e,services_prof s,classes c WHERE s.id_service_prof='".$id_service_prof."' AND s.classe=c.id_classe AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($ok) == 1)
    {
     $r = SQL_ligne_suivante ($ok) ;
     If ($r [0] == 1)
      {
       If ($r [1] == 1) { Return 1 ; } Else { Return 2 ; }
      }
     Else { Return 0 ; }
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi l'heure de debut, l'heure de fin et le pas pour la saisie horaire
 * @param int $id_service_prof Id service prof
 * @return array Renvoi un tableau [0]=Heure debut, [1]=Heure de fin, [2]=pas si existe sinon [0]=0
 */
 Function cahier_textes_horaires ($id_service_prof)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT e.heure_debut,e.heure_fin,e.heure_pas FROM etablissements e,classes c,services_prof p
                        WHERE p.id_service_prof='".$id_service_prof."' AND p.classe=c.id_classe AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $ligne = SQL_ligne_suivante ($r) ; } Else { $ligne [0] = 0 ; }
   Return $ligne ;
  }
 
 /**
 * Renvoi 1 si le cahier de textes existe sinon 0
 * @param int $id_service_prof Id service prof
 * @param int $date Date
 * @return int Renvoi 1 si existe, 0 si n'existe pas
 */
 Function cahier_textes_existe ($id_service_prof, $date)
  {
   Global $id_sql ;
   $r0 = SQL_commande ("SELECT id_cahier_texte FROM cahier_textes WHERE id_service_prof='".$id_service_prof."' AND date='".$date."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r0) == 1) { Return 1 ; } Else { Return 0 ; }
  }

 /**
 * Renvoi le nom du repertoire de stokage des documents du cahier de textes si actif sinon rien
 * @param int $id_classe Id classe
 * @return int Renvoi 1 si actif sinon 0
 */
 Function cahier_textes_repertoire_stockage ($id_classe)
  {
   Global $id_sql, $base_choisie ;
   $r = SQL_commande ("SELECT e.rep_stockage FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement AND e.cahier_textes='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $ligne = SQL_ligne_suivante ($r) ;
     If (!File_Exists ($ligne [0].$base_choisie."/")) { @MkDir ($ligne [0].$base_choisie."/", 0755) ; }
     Return $ligne [0].$base_choisie."/" ;
    }
   Else { Return "" ; }
  }
 
 /**
 * Renvoi la taille maximale d'un document du cahier de textes
 * @param int $id_classe Id classe
 * @return int Taille en octets si definie sinon 0
 */
 Function cahier_textes_taille_document ($id_classe)
  {
   Global $id_sql, $cahier_texte_coeff_multiplicateur ;
   $r = SQL_commande ("SELECT e.taille_fichier FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement AND e.cahier_textes='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $ligne = SQL_ligne_suivante ($r) ;
     Return ($ligne [0]*$cahier_texte_coeff_multiplicateur) ;
    }
   Else { Return 0 ; }
  }

 /**
 * Renvoi la taille maximale d'un espace de stockage de documents pour une discipline
 * @param int $id_classe Id classe
 * @return int Taille en octets si definie sinon 0
 */
 Function cahier_textes_taille_espace_stockage ($id_classe)
  {
   Global $id_sql, $cahier_texte_coeff_multiplicateur ;
   $r = SQL_commande ("SELECT e.taille_espace FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement AND e.cahier_textes='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $ligne = SQL_ligne_suivante ($r) ;
     Return ($ligne [0]*$cahier_texte_coeff_multiplicateur) ;
    }
   Else { Return 0 ; }
  }
 
 /**
 * Renvoi la taille prise par un espace de stockage de documents pour une discipline
 * @param int $id_service_prof Id du service prof
 * @return int Taille en octets
 */
 Function cahier_textes_taille_espace_utilise ($id_service_prof)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT DISTINCT SUM(d.taille) FROM cahier_documents d,cahier_textes t WHERE d.id_cahier_texte=t.id_cahier_texte AND t.id_service_prof='".$id_service_prof."'", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $ligne = SQL_ligne_suivante ($r) ; } Else { $ligne [0] = 0 ; }
   Return $ligne [0] ;
  }
 
 /**
 * Renvoi la date la plus eloignee des fichiers inseres
 * @param int $id_service_prof Id du service prof
 * @return int Date au format Y-m-d
 */
 Function cahier_textes_date_plus_eloignee ($id_service_prof)
  {
   Global $id_sql ;
   //$r = SQL_commande ("SELECT d.date FROM cahier_documents d,cahier_textes t WHERE d.id_cahier_texte=t.id_cahier_texte AND t.id_service_prof='".$id_service_prof."' ORDER BY d.date ASC LIMIT 1", $id_sql) ;
   $r = SQL_commande ("SELECT date FROM cahier_textes WHERE id_service_prof='".$id_service_prof."' ORDER BY date ASC LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $ligne = SQL_ligne_suivante ($r) ;
    }
   Else { $ligne [0] = Date ("Y-m-d") ; }    
   Return $ligne [0] ;
  }

 /**
 * Renvoi les tailles d'un fichier et de l'espace de stockage
 * @param int $id_classe Id classe
 * @return int Tailles en octets [0]=taille fichier,[1]=taille espace
 */
 Function cahier_textes_tailles ($id_classe)
  {
   Global $id_sql, $cahier_texte_coeff_multiplicateur ;
   $r = SQL_commande ("SELECT e.taille_fichier,e.taille_espace FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement AND e.cahier_textes='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1)
    {
     $ligne = SQL_ligne_suivante ($r) ;
     $ligne [0] *= $cahier_texte_coeff_multiplicateur ;
     $ligne [1] *= $cahier_texte_coeff_multiplicateur ;
     Return $ligne ;
    }
   Else { $ligne [0] = $ligne [1] = 0 ; Return $ligne ; }
  }
 
 /**
 * Renvoi un arrondi au mieux d'une taille en octets
 * @param int $taille Taille en octets
 * @param int $nbr_chiffres Nombre de chiffres
 * @return array [0]=Arrondi,[1]=Unite (en octets)
 */
 Function cahier_textes_arrondi_taille ($taille, $nbr_chiffres)
  {
   If (!Is_Numeric ($taille)) { $taille = 0 ; }
   If ($taille > 1099511627776) { $t [0] = Round ($taille/1099511627776, $nbr_chiffres) ; $t [1] = "T" ; }
   ElseIf ($taille > 1073741824) { $t [0] = Round ($taille/1073741824, $nbr_chiffres) ; $t [1] = "G" ; }
   ElseIf ($taille > 1048576) { $t [0] = Round ($taille/1048576, $nbr_chiffres) ; $t [1] = "M" ; }
   ElseIf ($taille > 1024) { $t [0] = Round ($taille/1024, $nbr_chiffres) ; $t [1] = "k" ; }
   Else { $t [0] = $taille ; $t [1] = "" ; }
   $t [0] = Str_Replace (".",",",$t [0]) ;
   Return $t ;
  }
 
 /**
 * Renvoi le nombre de fichiers et la taille totale
 * @param int $id_classe Id classe
 * @return int Tailles et nombre [0]=taille totale,[1]=Nombre de fichiers
 */
 Function cahier_textes_nombre_fichiers ($id_service_prof)
  {
   Global $id_sql ;
   $r = SQL_commande ("SELECT DISTINCT SUM(d.taille),SUM(1) FROM cahier_documents d,cahier_textes t WHERE d.id_cahier_texte=t.id_cahier_texte AND t.id_service_prof='".$id_service_prof."'", $id_sql) ;
   If (SQL_nbr_lignes ($r) == 1) { $ligne = SQL_ligne_suivante ($r) ; } Else { $ligne [0] = $ligne [1] = 0 ; }
   Return $ligne ;
  }
 
 /**
 * Fonction de test d'ecriture dans un repertoire
 * @param string $repertoire Nom du repertoire a tester
 * @return int 1 si ecriture ok sinon 0
 */
 Function cahier_textes_test_ecriture_rep ($repertoire)
  {
   $ok = 0 ;
   If ($fiche = @FOpen ($repertoire."/essai.php", "w"))
    {
     @FPuts ($fiche, "<?php \$ok=1 ; ?>") ;
     @FClose ($fiche) ;
     @Include ($repertoire."/essai.php") ;
     @UnLink ($repertoire."/essai.php") ;
    }
   Return $ok  ;
  }
 
 /**
 * Fonction de correction d'extension pour quelques types de fichiers particuliers
 * @param string $ext Extension du fichier a traiter
 * @return string Extension corrigee
 */
 Function cahier_textes_corrige_extension ($ext)
  {
   Switch ($ext)
    {
     Case 'htm': Return 'html' ;
     Case 'jpeg': Return 'jpg' ;
     Case 'tiff': Return 'tif' ;
     Default : Return $ext ;
    }
  }
 
 /**
 * Fonction de verification si le fichier peut-etre ajoute ou pas
 * @param string $fichier Extension du fichier a traiter
 * @param string $nom_fichier Nom du fichier a ajouter
 * @param string $emplacement Nom du repertoire de stockage
 * @param int $id_cahier_texte Identifiant du cahier de textes
 * @return array [0]=0=OK, [0]!=0:Probleme, [1]=Nom extension, [2]=Id_cahier_type_document
 */
 Function cahier_textes_verification_ajout_fichier ($fichier, $nom_fichier, $emplacement, $id_cahier_texte)
  {
   Global $id_sql, $id_classe, $id_service_prof, $repertoire_racine ;
   // Verification du type de fichier
   If (ereg ("\.([^.]+)$", $fichier ["name"], $match)) { $ext = cahier_textes_corrige_extension (filtrage (StrToLower ($match [1]))) ; } Else { $ext = '' ; }
   $resultat = SQL_commande ("SELECT id_cahier_type_document FROM cahier_type_documents WHERE extension='".$ext."' AND actif='1' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) != 1) { $r [0] = 1 ; $r [1] = $ext ; Return $r ; }
   Else
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     $r [2] = $ligne [0] ;
    }
   // Recuparation des parametres
   $taille_totale = cahier_textes_taille_espace_stockage ($id_classe) ;
   $taille_max = cahier_textes_taille_document ($id_classe) ;
   $taille = $fichier ["size"] ;
   // Verification de la taille du fichier
   If ($taille > $taille_max) { $r [0] = 2 ; $r [1] = $taille_max ; Return $r ; }
   If ($taille == 0) { $r [0] = 3 ; Return $r ; }
   // Verification de la taille du fichier par rapport a la taille de l'espace restant
   $teu = cahier_textes_taille_espace_utilise ($id_service_prof) ;
   If (($teu+$taille) > $taille_totale) { $r [0] = 4 ; $r [1] = $taille_totale ; $r [2] = $teu ; Return $r ; }
   // Verification si le fichier existe deja sur le serveur
   If (File_Exists ($repertoire_racine.$emplacement.$nom_fichier))
    {
     // Verification dans la bdd
     $resultat = SQL_commande ("SELECT id_cahier_document FROM cahier_documents WHERE document='".$nom_fichier."' AND id_cahier_texte='".$id_cahier_texte."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultat) == 1) { $r [0] = 5 ; Return $r ; }
    }
   $r [0] = 0 ;
   Return $r ;
  }
 
 /**
 * Gestion des fichiers "uploades" avec le cahier de textes
 * @param int $id_classe Identifiant de la classe
 * @param int $id_service_prof Identifiant du service prof
 * @param int $id_cahier_texte Identifiant du cahier de textes
 * @param array $fichier Noms fihcier temporaire et reel (variable global $_FILES [..])
 * @param string $fichier_titre Titre du document
 * @param string $nom_sous_repertoire Nom du repertoire de stockage final
 * @param int $action Numero de l'action (4 = MAJ)
 * @return string Message pour savoir si c'est ok
 */
 Function cahier_textes_gestion_fichier ($id_classe, $id_service_prof, $id_cahier_texte, $fichier, $fichier_titre, $nom_sous_repertoire, $action)
  {
   Global $id_sql, $repertoire_racine ;
   $rep = cahier_textes_repertoire_stockage ($id_classe) ;
   If ($rep != "")
    {
     If (!File_Exists ($repertoire_racine.$rep))
      {
       // Creation du repertoire racine
       $ok = @MkDir ($repertoire_racine.$rep, 0755) ;
      }
     // Test d'ecriture
     If (cahier_textes_test_ecriture_rep ($repertoire_racine.$rep) == 1)
      {
       $pbl [0] = 0 ;
       // Creation du repertoire de classe
       $ok = @MkDir ($repertoire_racine.$rep.$id_classe."/", 0755) ;
       // Creation du sous-repertoire disciplinaire
       $ok = @MkDir ($repertoire_racine.$rep.$id_classe."/".$id_service_prof."/", 0755) ;
       // Creation du sous-repertoire de stockage disciplinaire
       $nom_sr = Str_Replace ("-","_",Str_Replace (" ","_",$nom_sous_repertoire)) ;
       $ok = @MkDir ($repertoire_racine.$rep.$id_classe."/".$id_service_prof."/".$nom_sr."/", 0755) ;
       $nom_fichier = filtrage (Str_Replace (" ","_",$fichier ["name"])) ;
       $vaf = cahier_textes_verification_ajout_fichier ($fichier, $id_classe."/".$id_service_prof."/".$nom_sr."/".$nom_fichier, $rep, $id_cahier_texte) ;
       If ($vaf [0] == 0)
        {
         // Copie du fichier
	 $ok = @Copy ($fichier ["tmp_name"], $repertoire_racine.$rep.$id_classe."/".$id_service_prof."/".$nom_sr."/".$nom_fichier) ;
         If (!$ok) { $pbl [0]++ ; $pbl [$pbl [0]] = 4 ; }
         // Insertion BDD SQL
         If ($pbl [$pbl [0]] != 4)
          {
           $ok = SQL_commande ("INSERT INTO cahier_documents (id_cahier_texte,doc_type,titre,document,date,taille)
	                        VALUES ('".$id_cahier_texte."','".$vaf [2]."','".filtrage ($fichier_titre)."',
			                '".$id_classe."/".$id_service_prof."/".$nom_sr."/".$nom_fichier."','".Date ("Y-m-d H:i:s")."',
	  			        '".FileSize ($repertoire_racine.$rep.$id_classe."/".$id_service_prof."/".$nom_sr."/".$nom_fichier)."')", $id_sql) ;
	   If ($action == 4) { $message = "Mise &agrave; jour et i" ; } Else { $message = "I" ; }
           $message .= "nsertion du document effectu&eacute; !" ;
           If (!$ok) { $pbl [0]++ ; $pbl [$pbl [0]] = 5 ; }
          }
        }
       Else
        {
         Switch ((integer)$vaf [0])
          {
           Case 1 : $message = "Ce type de fichier (<b>.".$vaf [1]."</b>) n'est pas autoris&eacute; en t&eacute;l&eacute;chargement." ; Break ;
  	   Case 2 : $message = "T&eacute;l&eacute;chargement impossible car la taille maximale autoris�e est de ".Round ($vaf [1]/1024)."ko" ; Break ;
  	   Case 3 : $message = "Le fichier s&eacute;lectionn&eacute; semble vide : t&eacute;l&eacute;chargement impossible." ; Break ;
  	   Case 4 : $message = "T&eacute;l&eacute;chargement impossible : espace disque disponible (".Round (($vaf [1]-$vaf [2])/1024)."ko) insuffisant." ; Break ;
  	   Case 5 : $message = "Le serveur contient d&eacute;j&agrave; un fichier ayant le m&ecirc;me nom dans cet espace.<br>Si vous d&eacute;sirez quand m&ecirc;me le t&eacute;l&eacute;charger, renommez-le ou d&eacute;truisez celui de l'espace de stockage." ; Break ;
          }
        }
      }
     Else
      {
       // Pb d'ecriture
       $message = "Probl&egrave;me d'&eacute;criture dans le r&eacute;pertoire de stokage sur le serveur. Contactez l'administrateur !" ;
      }
    }
   Else
    {
     // Pb d'ecriture
     $message = "Aucun r&eacute;pertoire sur le serveur a &eacute;t&eacute; d&eacute;fini : Contactez votre administrateur Garennes !" ;
    }
   Return $message ;
  }
 
 // ----------------------------------------------------------
 // Gestion des sauvegardes automatiques
 // ----------------------------------------------------------
 /**
 * ReCalcul la (ou les) date(s) de(s) sauvegarde(s)
 */
 Function calcul_nouvelle_sauvegarde ()
  {
   $periode_sauvegarde = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE") ;
   If ($periode_sauvegarde == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE",0) ; $periode_sauvegarde = 0 ; }
   Switch ($periode_sauvegarde)
    {
     // Aucune
     Case 0 : detruire_configuration ("SYSTEME_PARAM","SAUVEGARDES","DATE") ;
              Break ;
     // A la semaine
     Case 1 : $numero = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_NUMERO") ;
              If ($numero == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_NUMERO",1) ; $numero = 1 ; }
              $comment = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_COMMENT") ;
              If ($comment == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_COMMENT",1) ; $comment = 1 ; }
              $quand = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_QUAND") ;
              If ($quand == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","JOUR_QUAND",0) ; $quand = 0 ; }
	      $mois = Date ("n") ;
	      $jour = Date ("j") ;
	      $annee = Date ("Y") ;
	      Switch ($quand)
	       {
	        Case 0 : $heure = Rand (0, 23) ; Break ;
		Case 1 : $heure = Rand (0, 7) ; Break ;
		Case 2 : $heure = Rand (8, 11) ; Break ;
		Case 3 : $heure = Rand (8, 16) ; Break ;
		Case 4 : $heure = Rand (12, 16) ; Break ;
		Case 5 : $heure = Rand (17, 23) ; Break ;
	       }
	      $minute = Rand (0, 59) ;
	      If ($numero == 8)
	       {
	        // Jour au hasard
		$nst = MkTime ($heure,$minute,0,$mois,$jour+Rand (0, 7),$annee) ;
	       }
	      Else
	       {
	        $i = 1 ;
		$ok = 0 ;
	        While (($ok == 0) And ($i <= 14))
		 {
		  $nst = MkTime ($heure,$minute,0,$mois,$jour+$i,$annee) ;
		  $jr = Date ("w", $nst) ;
		  If ($jr == $numero) { $ok = 1 ; }
		  $i++ ;
		 }
	       }
	      sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","DATE",$nst) ;
              Break ;
     // Au mois
     Case 2 : $millesime = millesime (0) ;
              $comment = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT") ;
              If ($comment == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT",1) ; $comment = 1 ; }
	      $quand = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_QUAND") ;
	      If ($quand == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_QUAND",0) ; $quand = 0 ; }
              For ($i = 1 ; $i <= 12 ; $i++)
               {
                $numero = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$i) ;
	        If ($numero == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$i,1) ; $numero = 1 ; }
    	        If ($numero == 1)
	         {
		  // Calcul des dates
		  $nst_courant = MkTime (Date ("H"),Date ("i"),0,Date ("m"),Date ("d"),Date ("Y")) ;
		  $nbr_total = 1 ;
		  If ($i < 9) { $m1 = $millesime+1 ; } Else { $m1 = $millesime ; }
		  If ($i+1 < 9) { $m2 = $millesime+1 ; } Else { If ($i == 8) { $m2 = $millesime+1 ; } Else { $m2 = $millesime ; } }
		  $delta = Round ((MkTime (0,0,-1,$i+1,1,$m2)-MkTime (0,0,0,$i,1,$m1))/($comment+2)) ;
		  $debut = MkTime ($heure,$minute,0,$i,1,$m1)+Rand (0, Round ($delta/2)) ;
		  For ($j = 0 ; $j < $comment ; $j++)
		   {
		    Switch ($quand)
	             {
	              Case 0 : $heure = Rand (0, 23) ; Break ;
		      Case 1 : $heure = Rand (0, 7) ; Break ;
		      Case 2 : $heure = Rand (8, 11) ; Break ;
		      Case 3 : $heure = Rand (8, 16) ; Break ;
		      Case 4 : $heure = Rand (12, 16) ; Break ;
		      Case 5 : $heure = Rand (17, 23) ; Break ;
	             }
		    $minute = Rand (0, 59) ;
		    $jour = Date ("d", $debut+$delta*$j+Rand (Round ($delta/2),$delta)) ;
		    $nst = MkTime ($heure,$minute,0,$i,$jour,$m1) ;
		    If ($nst_courant >= $nst) { $nbr_total++ ; }
		    sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_DATE_".$i."_".($j+1),$nst) ;
		   }
	          sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$i,$nbr_total) ;
		 }
		Else
		 {
		  For ($j = 0 ; $j < $comment ; $j++)
		   {
		    detruire_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_DATE_".$i."_".($j+1)) ;
		    detruire_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$i) ;
		   }
		 }
	       }
              Break ;
    }
  }
 
 /**
 * Renvoi 1 si on doit faire la sauvegarde tout de suite en verouillant celle-ci
 * @param int $fs Forcage sauvegarde (si entre deux periode, ou changement de periode) si option valide (3)
 * @return int 0:Pas de sauvegarde,1:Sauvegarde tout de suite
 */
 Function sauvegarde_automatique ($fs)
  {
   $ok = 0 ;
   $st_unix = Time () ;
   $periode_sauvegarde = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE") ;
   If ($periode_sauvegarde == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE",0) ; $periode_sauvegarde = 0 ; }
   Switch ($periode_sauvegarde)
    {
     // A la semaine
     Case 1 : $date_sauvegarde = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","DATE") ;
              If ($date_sauvegarde == "") { calcul_nouvelle_sauvegarde () ; }
              Else
               {
                If ($date_sauvegarde <= $st_unix) { $ok = 1 ; calcul_nouvelle_sauvegarde () ; }
               }
	      Break ;
     // Au mois
     Case 2 : $num_mois = Date ("n") ;
              $numero = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$num_mois) ;
	      If ($numero == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$num_mois,0) ; $numero = 0 ; }
	      If ($numero == 1)
	       {
	        $nombre = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT") ;
	        If ($nombre == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT",1) ; $nombre = 1 ; }
	        $total = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$num_mois) ;
		If ($total == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$num_mois,0) ; $total = 0 ; }
		If ($total <= $nombre)
		 {
		  $num = 0 ;
		  For ($i = $total ; $i <= $nombre ; $i++)
		   {
	            $nst = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_DATE_".$num_mois."_".$i) ;
		    If ($nst <= $st_unix) { $num = $i ; }
		   }
		  If ($num > 0)
		   {
		    If ($num <= $nombre) { $num++ ; }
		    sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$num_mois,$num) ;
		    $ok = 1 ;
		   }
		 }
	       }
	      Break ;
     // Au changement de periode
     Case 3 : $ok = $fs ;
              Break ;
    }
   Return $ok ;
  }
 
 /**
 * Renvoi la date de la prochaine la sauvegarde automatique
 * @return int Date en format time stamp unix
 */
 Function date_sauvegarde_automatique ()
  {
   Global $id_sql ;
   $dts = 0 ;
   $st_unix = Time () ;
   $periode_sauvegarde = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE") ;
   If ($periode_sauvegarde == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","PERIODICITE",0) ; $periode_sauvegarde = 0 ; }
   Switch ($periode_sauvegarde)
    {
     // A la semaine
     Case 1 : $date_sauvegarde = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","DATE") ;
              If ($date_sauvegarde >= $st_unix) { $dts = $date_sauvegarde ; }
	      Break ;
     // Au mois
     Case 2 : $num_mois = Date ("n") ;
              $numero = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$num_mois) ;
	      If ($numero == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_NUMERO_".$num_mois,0) ; $numero = 0 ; }
	      If ($numero == 1)
	       {
	        $nombre = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT") ;
	        If ($nombre == "") { sauvegarde_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_COMMENT",1) ; $nombre = 1 ; }
	        $total = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_TOTAL_".$num_mois) ;
		$ok = 0 ;
		For ($i = $total ; $i <= $nombre ; $i++)
		 {
	          $nst = restaure_configuration ("SYSTEME_PARAM","SAUVEGARDES","MOIS_DATE_".$num_mois."_".$i) ;
		  If (($nst > $st_unix) And ($ok == 0)) { $dts = $nst ; $ok = 1 ; }
		 }
	       }
	      Break ;
     // Au changement de periode
     Case 3 : $r = SQL_commande ("SELECT p.fin FROM classes c,periodes_classe p WHERE c.id_classe=p.classe AND c.num_periode=p.numero AND millesime='".millesime (0)."' ORDER BY p.fin DESC LIMIT 1", $id_sql) ;
              If (SQL_nbr_lignes ($r) == 1)
	       {
	        $pdt = SQL_ligne_suivante ($r) ;
		$dt = Explode ("-", $pdt) ;
		$dts = MkTime (0,0,0,$dt [1],$dt [2],$dt [0]) ;
	       }
              Break ;
    }
   Return $dts ;
  }
 
 /**
 * Determine le repertoire de sauvegarde relatif et creation absolue
 * @param string $date Date
 * @param string $heure Heure
 * @return string Nom du repertoire
 */
 Function repertoire_sauvegarde ($date, $heure)
  {
   Global $separateur_repertoire, $repertoire_sauvegarde, $multi_etablissement, $base_choisie ;
   // Detecte le mode multi-etablissements (mode supervision actif)
   If ($multi_etablissement == 0) { $nom = "s".$date."_".$heure ; }
   Else
    {
     @MkDir ($repertoire_sauvegarde.$separateur_repertoire.$base_choisie) ;
     $nom = $base_choisie.$separateur_repertoire."s".$date."_".$heure ;
    }
   @MkDir ($repertoire_sauvegarde.$separateur_repertoire.$nom) ;
   Return $nom ;
  }
 
 /**
 * Effectue la sauvegarde en format SQL des donnees
 * @return string Sauvegarde
 */
 Function faire_sauvegarde_donnees ()
  {
   Global $id_sql, $ext_sql, $separateur_repertoire, $repertoire_sauvegarde ;
   $d1 = Date ("Y-m-d") ;
   $d2 = Date ("H-i-s") ;
   $nom_sql = "s".$d1."_".$d2 ;
   $nom_rep = repertoire_sauvegarde ($d1, $d2) ;
   $ou = $repertoire_sauvegarde.$separateur_repertoire.$nom_rep ;
   
   $fichier = FOpen ($ou.$separateur_repertoire.$nom_sql.$ext_sql, "w") ;
   $resultats = SQL_commande ("SHOW TABLES", $id_sql) ;
   $f [0] = SQL_nbr_lignes ($resultats) ;
   For ($i = 1 ; $i <= $f [0] ; $i++)
    {
     $ligne = SQL_ligne_suivante ($resultats) ;
     $f [$i] = $ligne [0] ;
    }
   $d = donnees_table_SQL ($f) ;
   FPuts ($fichier, $d) ;
   FClose ($fichier) ;
   $taille = FileSize ($ou.$separateur_repertoire.$nom_sql.$ext_sql) ;
   /*
   If (PHP_OS == "Linux")
    {
     @Exec ("cd ".$ou."; tar cf ./".$nom_sql.".tar ./".$nom_sql.$ext_sql) ;
     @Exec ("cd ".$ou."; gzip ./".$nom_sql.".tar") ;
     @UnLink ($ou.$separateur_repertoire.$nom_sql.$ext_sql) ;
     $taille = FileSize ($ou.$separateur_repertoire.$nom) ;
    }
   */
   $resultats = SQL_commande ("INSERT INTO sauvegardes (nom_repertoire,date,type,taille,compresse,transmis,separateur,commentaires)
                               VALUES ('".$nom_rep."','".$d1." ".$d2."','Toutes_SQL','".$taille."','0','0','','Sauvegarde automatique')", $id_sql) ;
   $resultats = SQL_commande ("SELECT id_sauvegarde FROM sauvegardes WHERE date='".$d1." ".$d2."' AND commentaires='Sauvegarde automatique' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1)
    {
     $l = SQL_ligne_suivante ($resultats) ;
     $ok = SQL_commande ("INSERT INTO sauvegardes_fichiers (numero,nom,extension,taille) VALUES ('".$l [0]."','".$nom_sql."','".$ext_sql."','".$taille."')", $id_sql) ;
    }
  }
 
 // ----------------------------------------------------------
 // Gestion des modules
 // ----------------------------------------------------------
 /**
 * Renvoi 1 si le module $num_module est actif sinon 0
 * @param int $num_module Identifiant module
 * @param int $id_utilisateur Identifiant utilisateur (0=Tout le monde)
 * @param int $droit Droit correspondant
 * @return int Renvoi 1 si actif sinon 0
 */
 Function module_actif ($num_module, $id_utilisateur, $droit)
  {
   Global $id_sql ;
   $r0 = SQL_commande ("SELECT id_gestion_module FROM gestion_modules WHERE identifiant='".$num_module."' AND (id_utilisateur='".$id_utilisateur."' OR id_utilisateur='0') AND droits='".$droit."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($r0) == 1) { Return 1 ; } Else { Return 0 ; }
  }
 
 // ----------------------------------------------------------
 // Gestion de la messagerie externe
 // ----------------------------------------------------------
 /**
 * Fonction qui envoi un mel de confirmation de fonctionnement
 * @param string $adresse_envoi Adresse de la boite ou envoyer la confirmation
 * @param int 1=Ok, 0=Non ok
 * @return boolean Retour de la fonction mail de php
 */
 Function mel_confirmation_fonctionnement ($adresse_envoi)
  {
   // Confirmation mel
   $sujet = "Confirmation adresse MEL dans Garennes." ;
   $entetes  = "From: ".$adresse_envoi."\n" ;
   $entetes .= "X-Mailer: Plateforme Garennes (JFC)\n" ;
   $entetes .= "X-Sender: <".$adresse_envoi.">\n" ;
   $entetes .= "X-Priority: 1\n" ;
   $entetes .= "Return-Path: <".$adresse_envoi.">\n" ;
   $entetes .= "Reply-To: ".$adresse_envoi."\n" ;
   $entetes .= "MIME-version: 1.0\n" ;
   $entetes .= "Content-Type: text/html; charset=iso-8859-1\n" ;
   $entetes .= "Content-Transfert-Encoding: 8bit\n" ;
   $texte = "Si vous avez re&ccedil;u ce message, c'est que le fonctionnement de la messagerie externe &agrave; partir de Garennes est correct.<br><b>Veuillez ne pas r&eacute;pondre</b>. Merci.<br><b>JFC</b>" ;
   Return Mail ($adresse_envoi, $sujet, $texte , $entetes) ;
  }
 
 /**
 *
 * @param int $id_utilisateur_from Identifiant de l'utilisateur qui envoi
 * @param mixed $id_destinataire Contient soit identifiant du destinataire, soit tableau contenant les identifiants des destinataires [0]=Nombre, [i]=id
 * @param string $sujet Sujet du mel
 * @param string $message Message lui-meme
 * @param int $type Type de message (0=TEXTE,1=HTML)
 * @return boolean Retour de la fonction mail de php
 */
 Function mel_envoi_en_masse ($id_utilisateur_from, $id_destinataire, $sujet, $message, $type)
  {
   Global $id_sql ;
   $u = SQL_commande ("SELECT mel FROM utilisateurs WHERE id_utilisateur='".$id_utilisateur_from."' AND mel!='' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($u) == 1)
    {
     $ut = SQL_ligne_suivante ($u) ;
     If ($ut [0] != "")
      {
       $entetes  = "From: ".$ut [0]."\n" ;
       If (Is_Array ($id_destinataire))
        {
	 $requete = "SELECT mel FROM utilisateurs WHERE (" ;
	 For ($i = 1 ; $i <= $id_destinataire [0] ; $i++)
	  {
	   If ($i > 1) { $requete .= " OR " ; }
	   $requete .= "id_utilisateur='".$id_destinataire [$i]."'" ;
	  }
	 $u = SQL_commande ($requete.") AND mel!=''", $id_sql) ;
	 $nombre = SQL_nbr_lignes ($u) ;
	 If ($nombre > 0)
	  {
	   $entetes .= "Cc: ";
	   For ($i = 1 ; $i <= $nombre ; $i++)
	    {
	     $dst = SQL_ligne_suivante ($u) ;
	     If ($i > 1) { $entetes .= "," ; }
	     $entetes .= $dst [0] ;
	    }
	   $entetes .= "\n" ;
	  }
	 $destinataire = $ut [0] ;
	}
       Else
        {
	 $u = SQL_commande ("SELECT mel FROM utilisateurs WHERE id_utilisateur='".$id_destinataire."' AND mel!='' LIMIT 1", $id_sql) ;
	 If (SQL_nbr_lignes ($u) == 1)
          {
	   $dst = SQL_ligne_suivante ($u) ;
           $destinataire = $dst [0] ;
	  }
	 Else { $destinataire = $ut [0] ; }
	}
       $entetes .= "X-Mailer: Plateforme Garennes (JFC)\n" ;
       $entetes .= "X-Sender: <".$ut [0].">\n" ;
       $entetes .= "X-Priority: 1\n" ;
       $entetes .= "Return-Path: <".$ut [0].">\n" ;
       $entetes .= "Reply-To: ".$ut [0]."\n" ;
       $entetes .= "MIME-version: 1.0\n" ;
       If ($type == 1) { $plus = "html" ; } Else { $plus = "plain" ; }
       $entetes .= "Content-Type: text/".$plus."; charset=iso-8859-1\n" ;
       $entetes .= "Content-Transfert-Encoding: 8bit\n" ;
       Return Mail ($destinataire, $sujet, $message, $entetes) ;
      }
    }
   Return False ;
  }
 
 // ----------------------------------------------------------
 // Gestion des erreurs PHP
 // ----------------------------------------------------------
 /**
 * Gestion des erreurs pour PHP
 * @param int $errno Numero de l'erreur
 * @param string $errstr Nom de l'erreur
 * @param string $errfile Nom du fichier contenant l'erreur
 * @param int $errline Numero de la ligne dans le fichier contenant l'erreur
 */
 Function gestion_erreurs ($errno, $errstr, $errfile, $errline)
  {
   Switch ($errno)
    {
        Case E_USER_ERROR : Echo "<b>ERREUR</b> [".$errno."] ".$errstr."<br>" ;
	                    Echo "  Erreur fatale sur la ligne ".$errline." dans le fichier ".$errfile ;
		            Echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>" ;
		 	    Echo "Arr&ecirc;t...<br>" ;
		 	    Exit (1) ;
		 	    Break ;
      Case E_USER_WARNING : Echo "<b>ALERTE</b> [".$errno."] ".$errstr."<br>" ;
			    Break ;
       Case E_USER_NOTICE : Echo "<b>AVERTISSEMENT</b> [".$errno."] ".$errstr."<br>" ;
	                    Break ;
/**                  Default : Echo "Type d'erreur inconnu : [".$errno."] ".$errstr."<br />" ;
		            Echo "  Erreur sur la ligne ".$errline." dans le fichier ".$errfile ;
		            Echo ", PHP ".PHP_VERSION." (".PHP_OS.")<br>" ;
	                    Break ;
*/
    }
   Return True ;
  }

 // ===============================================================================
 //                            PROGRAMME PRINCIPAL
 // ===============================================================================
 //
 Set_Error_Handler ("gestion_erreurs") ;
 If ($debug_php == 1) { Error_Reporting (E_ALL) ; } Else { Error_Reporting (E_ALL ^ E_NOTICE) ; }
 
 If (!IsSet ($verification_installation))
  {
   // Test le serveur primaire si existe
   If (!IsSet ($sql_port))
    {
     If (IsSet ($type_bdd))
      {
       If ($type_bdd == "MySQL") { $port = 3306 ; } Else { $port = 5432 ; }
      }
     Else { $port = 3306 ; }
    }
   Else
    {
     $port = 3306 ;
    }
   // Test sans port
   If (IsSet ($_SESSION ["bdd_sql"]) And ($_SESSION ["bdd_sql"] != "")) { $base_choisie = $_SESSION ["bdd_sql"] ; }
   ElseIf (IsSet ($bdd_sql) And ($bdd_sql != "")) { $base_choisie = $bdd_sql ; }
   ElseIf ($sql_base != "") { $base_choisie = $sql_base ; }
   Else { $base_choisie = "garennes" ; }
   
   $id_sql = SQL_connexion ($sql_adresse, $sql_qui, $sql_passe, $base_choisie, "") ;
   If (!$id_sql)
    {
     If ($f = @FSockOpen ($sql_adresse, $port, $errno, $errstr, $timeout))
      {
       FClose ($f) ;
       $id_sql = SQL_connexion ($sql_adresse, $sql_qui, $sql_passe, $base_choisie, $sql_port) ;
       If (!$id_sql)
        {
         If ($sql_secondaire != "")
          {
           // Test le serveur secondaire si existe
           If ($f = @FSockOpen ($sql_secondaire, $sql_port, $errno, $errstr, $timeout))
            {
             FClose ($f) ;
             $id_sql = SQL_connexion ($sql_secondaire, $sql_qui, $sql_passe, $base_choisie, $sql_port) ;
            }
           ElseIf ($sql_tertiaire != "")
            {
             // Test le serveur tertiaire si existe
             If ($f = @FSockOpen ($sql_tertiaire, $sql_port, $errno, $errstr, $timeout))
              {
               FClose ($f) ;
               $id_sql = SQL_connexion ($sql_tertiaire, $sql_qui, $sql_passe, $base_choisie, $sql_port) ;
              }
	    }
          }
        }
      }
    }
   If (!IsSet ($id_sql))
    {
     Echo "<html><body bgcolor=\"#ffffff\" text=\"#000000\">" ;
     Echo "<br><br><center>Flute : Serveur non accessible pour l'instant !</center><br>" ;
     Echo "<br><center>Essayez un peu plus tard.<br><br>" ;
     Echo "<center>Raisons possibles : Maintenance, Pannes, ...</center>"  ;
     Echo "</body></html>" ;
     Exit () ;
    }
  }
 
 // Initialiser le generateur de nombres aleatoires
 mt_srand ((double)microtime ()*1000000) ;
 
 UnSet ($f) ;
 // Gestion transfert
 $navigateur_type_codage = restaure_configuration_defaut ("SYSTEME_PARAM", "GENERAL", "JEU_WEB_NAV", $navigateur_type_codage) ;
 SQL_transmission (3) ;
 // Gestion du journal
 $debug_journal = restaure_configuration_defaut ("SYSTEME_PARAM", "GENERAL", "DEBUG_JOURNAL", $debug_journal) ;
 // Gestion millesime
 $delta_millesime = restaure_configuration_delta_millesime () ;
?>